我已经在 Chrome开发者控制台中测试了以下代码0 || -0
,结果又回来了-0
,我试图找出原因。该表表示不同JS环境中的结果。
╔══════════════════════════════════════════════════════╗
║ Browser ║ Version ║ 0 || -0 ║
╠══════════════════════════════════════════════════════╣
║Internet Explorer 11 ║ 11.3024.14393.0 ║ 0 ║
║Google Chrome ║ 75.0.3770.100 ║ -0 ║
║Mozilla Firefox (Quantum) ║ 67.0.4 ║ -0 ║
║Microsoft Edge (Chromium) ║ 77.0.197.1 ║ -0 ║
║Microsoft Edge (Chakra) ║ 44.17763.1.0 ║ 0 ║
║Node.js ║ 11.1.0 ║ -0 ║
╚══════════════════════════════════════════════════════╝
我的假设是,在第一种情况下,当-0
在右侧时,结果为-0
,但是当它在左侧时,结果为0
。这使我相信,在 binary逻辑OR 操作期间,-0
位于左侧时,将丢弃符号位(无论出于何种原因),并且该操作的执行方式为{{ 1}}。同时,当它在右侧时,因为存在0 || 0
运算符,它可能在数字上添加了一个符号位,这导致右侧数字多了一位,从而导致右侧值被返回
更有趣的是,当您使用正数时,其行为是不同的。现在-
返回-1 || 4
,而-1
返回4 || -1
,而4
返回4 || -1 || 6
(不返回4
) 。这种行为是由6
运算符引起的,还是因为我正在开发人员控制台中测试此代码?
答案 0 :(得分:6)
根据官方规范,如果a || b
为真,a
的值为a
,如果b
为假,则a
的值为。 &&
的工作方式类似-如果可以仅通过检查左侧的值来确定整个表达式的值,则它将评估为左侧,否则将评估为右侧一侧。
请参见MDN:
逻辑或(||)
expr1 || expr2
如果expr1可以转换为true,则返回expr1;否则,返回expr2。
由于0
和-0
都是假的,0 || -0
应该计算为-0
,因为左侧是假的。
比较与 也许IE和Edge-Chakra只是忽略了 Edge做同样的事情: 区别可能只是纯粹的视觉效果。以下代码段按预期在Edge中打印 0
/ -0
以外的其他数字会产生不同的效果,因为其他非零数字也不是假的(NaN
除外)。 / p>
0
和-0
之间的区别,而无论显示什么,都显示0
。例如,如果您在IE的控制台中键入-0
,则会得到0
(不是 -0
):true
,false
:const x = -0;
console.log(Object.is(x, -0));
console.log(Object.is(x, 0));
答案 1 :(得分:1)
“ 二进制逻辑或”可能是假设有问题的地方:存在按位/二进制或|
,查看二进制数字,而逻辑或{ {1}},将每个操作数视为单个true / false值,因此它们是完全不同的。
您拥有后一个输入,这就是为什么您取回确切输入之一而不是它们的“组合”的原因。这在||
中尤其明显,因为在两个的组件代码中,它是-1
(在涉及按位运算的JavaScript中,32是{{3}}),因此对所有内容进行二进制或运算它只是复制111...1111
。但是如果是逻辑或,则返回第一个操作数不变,如果它是'true-ish',或者返回第二个操作数,再次不变。
(当然,另一个答案中所描述的带有-1
的MS事物肯定会增加一些混乱,但是它发生在逻辑操作之前且与逻辑操作无关)