JavaScript-为什么(0 || -0)返回-0

时间:2019-06-30 22:21:04

标签: javascript

我已经在 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运算符引起的,还是因为我正在开发人员控制台中测试此代码?

2 个答案:

答案 0 :(得分:6)

根据官方规范,如果a || b为真,a的值为a,如果b为假,则a的值为。 &&的工作方式类似-如果可以仅通过检查左侧的值来确定整个表达式的值,则它将评估为左侧,否则将评估为右侧一侧。

请参见MDN

  

逻辑或(||)

     

expr1 || expr2

     

如果expr1可以转换为true,则返回expr1;否则,返回expr2。

由于0-0都是假的,0 || -0 应该计算为-0,因为左侧是假的。

比较与0 / -0以外的其他数字会产生不同的效果,因为其他非零数字也不是假的(NaN除外)。 / p>

也许IE和Edge-Chakra只是忽略了0-0之间的区别,而无论显示什么,都显示0。例如,如果您在IE的控制台中键入-0,则会得到0不是 -0):

enter image description here

Edge做同样的事情:

enter image description here

区别可能只是纯粹的视觉效果。以下代码段按预期在Edge中打印truefalse

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事物肯定会增加一些混乱,但是它发生在逻辑操作之前且与逻辑操作无关)