我在 chrome 浏览器控制台中测试了这个 javascript 表达式的结果(输出结果为粗体):
a = false
false
b = false
false
a||b
false
a|=b
0
为什么在最后一个表达式中 (a|=b) 不返回 a布尔值?
更新:我可以这样做吗?a=!!(a|=b)
我在 chrome 浏览器控制台中测试了这个 javascript 表达式的结果(输出结果为粗体):
a = false
false
b = false
false
a||b
false
a|=b
0
为什么在最后一个表达式中 (a|=b) 不返回 a布尔值?
更新:我可以这样做吗?a=!!(a|=b)
按位运算符将其操作数视为一组 32 位(零和一)并返回标准 JavaScript 数值。
取自mdn
它不返回布尔值,但分配变量的值和最后一条语句将值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分配的最后一个变量的值(在这种情况下a
或b
使用 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)。
因为|
不是布尔值,而是作用于有符号 32 位整数的位运算符- 数字。因此,false
在应用运算符之前,布尔输入首先被强制转换为零。
此外,逻辑 OR 运算符||
也不是布尔值。它只是短路评估为左(如果为真)或右表达式的值,在您的情况下为布尔类型。如果你用过var a=0, b=0
它也会产生0
。