0

我在 chrome 浏览器控制台中测试了这个 javascript 表达式的结果(输出结果为粗体):
a = false
false
b = false
false
a||b
false
a|=b
0
为什么在最后一个表达式中 (a|=b) 不返回 a布尔值?

更新:我可以这样做吗?a=!!(a|=b)

4

3 回答 3

1

按位运算符将其操作数视为一组 32 位(零和一)并返回标准 JavaScript 数值。

取自mdn

于 2013-03-12T12:35:20.060 回答
1

它不返回布尔值,但分配变量的值和最后一条语句将值a从布尔值更改为整数:

操作类型值输出
               ABAB       
a = false bool undefined false undefined false 1 
b = false bool bool false false false 1 
a || b bool bool false false false 2 
a |= b 整数 bool 0 false 0 3

1分配的最后一个变量的值(在这种情况下ab使用 value false)。
2逻辑运算符||(逻辑或)的值:false OR false === false。让我稍微简化一下(太多了?)但是因为a是假的,所以你有b. 只需看一下§ 11.11
3按位运算符|(按位或,请参阅第 11.10 节),规范说必须将其操作数评估为其(在您的情况下为布尔值),然后转换为有符号的 32 位整数,结果是另一个有符号的 32 位整数。从§ 9.3我们知道从布尔到数字的转换产生 0false和 1 true,然后根据第 9.5 节将它们转换为 32 位有符号整数(这里又是 0)。

参考
JavaScript 语言规范

于 2013-03-12T12:52:23.140 回答
0

因为|不是布尔值,而是作用于有符号 32 位整数的位运算符- 数字。因此,false在应用运算符之前,布尔输入首先被强制转换为零。

此外,逻辑 OR 运算符||也不是布尔值。它只是短路评估为左(如果为真)或右表达式的值,在您的情况下为布尔类型。如果你用过var a=0, b=0它也会产生0

于 2013-03-12T12:54:28.573 回答