【问题标题】:JavaScript: why does bitwise OR of booleans return a number instead of a boolean?JavaScript:为什么布尔值的按位或返回数字而不是布尔值?
【发布时间】:2015-02-19 09:43:28
【问题描述】:

我发现布尔值的位运算符在 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 */
}

【问题讨论】:

  • 您能否在布尔值上添加一些|&amp; 的真实用例示例?
  • 就此而言,您说的是哪种语言支持带有布尔值的|=
  • 我想按位运算总是返回数值,即使是布尔值;考虑到它们本身等同于数字。为什么你会期望一个布尔返回值?
  • 我不明白你什么时候会在布尔值上使用位运算符。如果你做true | false 它是true,最后如果我想知道左边还是右边部分是true,我会使用||(逻辑或)而不是|
  • 很高兴看到有人实际检查规范!

标签: javascript numbers boolean


【解决方案1】:

让按位运算符的行为一致(总是将其操作数转换为数字)似乎是一个足够好的理由来指定它们的方式。几年前,es-discuss 列表上有关于添加 ||= 和类似速记运算符的讨论,但 Eich & Co 对添加此类内容非常保守,我似乎记得有一条评论说它“没有” t 拉它的句法权重。” :-)

请注意,由于 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>

【讨论】:

  • 呵呵,是的,我只是对类型强制偏执。我使用类型安全的等式/不等式运算符,当我忘记时,我让 jshint 唠叨我。我想我已经被 C/C++ 迷住了。尤其是 C++,使用构造函数的隐式转换有无数种不同的方式可能会给您带来麻烦。
  • @GreatBigBore:类型强制确实很棘手,但它的真/假子集非常简单:假值是0NaN""nullundefined,当然还有false;其他一切都是真实的。
猜你喜欢
  • 2013-08-10
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 2011-01-29
  • 2022-11-08
  • 2021-09-20
  • 1970-01-01
  • 2020-03-21
相关资源
最近更新 更多