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

Sag*_*ual 5 javascript boolean numbers

我发现了bools上的按位运算符在JavaScript中不会返回bool的困难方式.我认为它一定是个bug,但我在ECMAScript规范中查了一下,果然,它说按位运算符返回数字,而不是bool.它没有说明当你在布尔值上使用它们时产生的怪异.为什么这样做?我已经在其他语言中使用了这种技术多年,所以我完全不知道为什么它在JavaScript中做了不同的事情.有任何想法吗?是不是因为没有人以这种方式使用按位运算符(除了我),还是有技术原因?我无法想象检查类型并返回布尔值会很难.

供参考,代码如下:

var found = false;
console.log(found, typeof(found));

found |= true;
console.log(found, typeof(found));

found = true;
console.log(found, typeof(found));
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

false 'boolean'
1 'number'
true 'boolean'
Run Code Online (Sandbox Code Playgroud)

编辑:

根据要求,我在C,C++中使用过这个,我很确定PHP,虽然我不会发誓.是的,我意识到C/C++是打字的,所以内部会有所不同.我只是想知道为什么JavaScript表现不同.

根据请求,我将如何使用| =的示例

var foundLowest = false;

for(var k = 0; k < someLength; ++k) {
    foundLowest |= someFunctionThatReturnsTF(k);
}

if(foundLowest === true) {
    /* do stuff */
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 6

使按位运算符的行为始终如一(始终将其操作数转换为数字)似乎是一个足够好的理由,可以按照它们的方式指定它们.几年前,有关添加||=和类似速记运营商的es-discuss列表的讨论,但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
}
Run Code Online (Sandbox Code Playgroud)
<!-- 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>
Run Code Online (Sandbox Code Playgroud)