JavaScript:为什么布尔值的按位 OR 返回一个数字而不是一个布尔值

JavaScript: why does bitwise OR of booleans return a number instead of a boolean?

本文关键字:布尔值 一个 数字 返回 为什么 OR JavaScript      更新时间:2023-09-26

我发现布尔值上的按位运算符在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哪个强制truefalse强制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>