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

时间:2014-12-20 18:47:05

标签: javascript numbers boolean

我发现在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));

产生以下输出:

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 */
}

1 个答案:

答案 0 :(得分:6)

使按位运算符的行为始终如一(始终将其操作数转换为数字)似乎是一个足够好的理由,可以按照它们的方式指定它们。几年前,有关添加||=和类似速记运算符的es-discuss列表的讨论,但是Eich&amp; amp; Co对于添加类似的东西非常保守,我似乎回想起一条评论,认为它“没有拉动它的语法重量”。 : - )

请注意,因为JavaScript很乐意将任何值强制转换为布尔值,所以您可以愉快地使用当前样式并使其仍然有效,因为true强制1强制转换为true } {和false强制0强制false。 E.g:

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>