JavaScript:为什么布尔值的按位 OR 返回一个数字而不是一个布尔值
JavaScript: why does bitwise OR of booleans return a number instead of a boolean?
我发现布尔值上的按位运算符在JavaScript中不返回布尔值的艰难方式。我认为这一定是一个错误,但我在 ECMAScript 规范中查找了它,果然,它说按位运算符返回数字,而不是布尔值。它没有说当你在布尔值上使用它们时产生的怪异之处。为什么要这样做? 我已经在其他语言中使用了这种技术多年,所以我完全困惑为什么它在 JavaScript 中做了一些不同的事情。有什么想法吗?仅仅是因为没有人以这种方式使用过按位运算符(除了我(,还是有技术原因?我无法想象很难检查类型并返回布尔值。
作为参考,以下代码:
var found = false;
console.log(found, typeof(found));
found |= true;
console.log(found, typeof(found));
found = true;
console.log(found, typeof(found));
生成以下输出:
false 'boolean'
1 'number'
true 'boolean'
编辑:
根据要求,我已经在 C、C++ 中使用了它,我很确定 PHP,尽管我不会发誓。是的,我意识到 C/C++ 是键入的,因此内部会有所不同。我只是想知道为什么JavaScript会有不同的行为。
根据要求,我通常如何使用 |=
的示例var foundLowest = false;
for(var k = 0; k < someLength; ++k) {
foundLowest |= someFunctionThatReturnsTF(k);
}
if(foundLowest === true) {
/* do stuff */
}
让按位运算符的行为一致(始终将其操作数转换为数字(似乎是按原样指定它们的充分理由。几年前,在es-discussion列表中有关于添加||=
和类似速记运算符的讨论,但Eich & Co对添加这样的东西非常保守,我似乎记得一条评论,它"没有发挥其语法权重。
JavaScript 乐于将任何值强制给布尔值,所以您可以愉快地使用您当前的样式并让它仍然有效,因为true
强制1
哪个强制true
,false
强制0
哪个强制false
。 例如:
var a = false;
a |= true;
// Even though `a` is now `1`, it works just fine
if (a) {
snippet.log(a + " => if branch"); // Does this one
} else {
snippet.log(a + " => else branch");
}
a &= false;
// Even though `a` is now `0`, it works just fine
if (a) {
snippet.log(a + " => if branch");
} else {
snippet.log(a + " => else branch"); // Does this one
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
相关文章:
- 如何从javascript/jquery中的复选框中获取布尔值
- KendoUI网格行过滤器,带有布尔值下拉列表
- php布尔值's小写AND大写和数字布尔值'可以接受
- select中布尔值的Angularjs ng值不起作用
- 由于布尔值的变化,Django视图中的字符串格式不正确
- Coffeescript:添加一个由布尔值控制的条件类名
- RegisterClientScriptBlock - confirm box 返回一个布尔值给 aspx.cs
- JavaScript:为什么布尔值的按位 OR 返回一个数字而不是一个布尔值
- JavaScript后缀了一个用于限制事件的布尔值/一次性标志
- 返回一个布尔值的Angularjs自定义服务方法
- 在javascript中,是一个空字符串,作为布尔值总是为false
- 我怎么能返回一个空对象同时空对象等于布尔值false在javascript
- 存储一个布尔值或整型值,并在页面加载后检查/更改它的值
- 如何声明一个javascript变量并将其值赋给一个返回布尔值的php文件
- 这是一个很好的实践乘以一个布尔值在javascript上
- 如果没有被使用,为什么返回一个布尔值
- 为什么Angular 2's CanActivate返回一个Observable<布尔值>而不是承诺
- 调用一个为ng-show返回布尔值的函数是个好主意吗
- 如何在MongoDB中查询一个布尔值的字段,并返回一个布尔值,无论它是true还是false
- indexOf != -1返回一个布尔值吗?