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

Boš*_*zik 2 javascript

我已经0 || -0Chrome开发者控制台中测试了以下代码,-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    ?
????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

我的假设是,在第一种情况下,当位于-0右侧时,结果为-0,但是当位于左侧时,结果为0。这使我相信,在二进制逻辑“或”运算-0期间,当位于左侧时,将丢弃符号位(无论出于何种原因),并且这样执行运算。同时,当它在右侧时,因为该运算符存在,所以它可能在数字上添加了一个符号位,这导致右侧数字多了一位,从而导致右侧值被返回。0 || 0-

更有趣的是,当您使用正数时,其行为会有所不同。现在的-1 || 4回报-1,而4 || -1回报率44 || -1 || 6回报率4(应该不是返回6)。这是由-操作员引起的还是因为我正在开发人员控制台中测试此代码?

Cer*_*nce 6

按照官方规范,a || b计算结果为a,如果a是truthy,或者b如果a是falsey。&&以类似的方式工作-如果可以仅通过检查左侧的值来确定整个表达式的值,则它将在左侧求值,否则将在右侧求值。

参见MDN

逻辑或(||)

expr1 || expr2

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

由于0-0均为假,因此0 || -0 求值为-0,因为左侧为假。

比较数字0/ -0会有不同的效果,因为其他非零数字是不是falsey(除NaN)。

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

在此处输入图片说明

Edge做同样的事情:

在此处输入图片说明

不过,差异可能仅仅是视觉上的。以下代码段按预期在Edge中打印truefalse

const x = -0;
console.log(Object.is(x, -0));
console.log(Object.is(x, 0));
Run Code Online (Sandbox Code Playgroud)