我已经0 || -0在Chrome开发者控制台中测试了以下代码,-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回报率4和4 || -1 || 6回报率4(应该不是返回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中打印true,false:
const x = -0;
console.log(Object.is(x, -0));
console.log(Object.is(x, 0));Run Code Online (Sandbox Code Playgroud)