在ECMAScript 5.1规范中,+0和-0是有区别的。
为什么+0 === -0的结果为真?
在ECMAScript 5.1规范中,+0和-0是有区别的。
为什么+0 === -0的结果为真?
当前回答
我将其归咎于严格相等比较方法('===')。 看4d部分
参见7.2.13规范严格相等比较
其他回答
我将其归咎于严格相等比较方法('===')。 看4d部分
参见7.2.13规范严格相等比较
我们可以使用Object。就是区分+0和-0,还有一点,NaN==NaN。
Object.is(+0,-0) //false
Object.is(NaN,NaN) //true
我刚刚遇到了一个例子,其中+0和-0的行为确实非常不同:
Math.atan2(0, 0); //returns 0
Math.atan2(0, -0); //returns Pi
小心:即使在使用数学。对-0.0001这样的负数四舍五入,它实际上会是-0,并且会打乱上面所示的一些后续计算。
快速和肮脏的方法来解决这个问题,像这样做smth:
if (x==0) x=0;
或者是:
x+=0;
这将数字转换为+0,如果它是-0。
如果需要支持-0和+0的符号函数:
var sign = x => 1/x > 0 ? +1 : -1;
它就像数学一样。符号,只不过符号(0)返回1而符号(-0)返回-1。
2021的答案
+0和-0是一样的吗?
简单回答:取决于您使用的比较运算符。
长一点的回答:
基本上,到目前为止,我们有4种比较类型:
“松”的平等
console.log(+0 == -0); // true
“严格的”平等
console.log(+0 === -0); // true
“同值”等式(ES2015的Object.is)
console.log(Object.is(+0, -0)); // false
“同值零”平等(ES2016)
console.log([+0].includes(-0)); // true
结果,只有Object。Is(+0, -0)和其他的有区别。 x = +0, y = -0;// true ->使用' loose '相等 Console.log (x === y);// true ->使用' strict '相等 console.log ([x] .indexOf (y));// 0 (true) ->使用' strict '相等 console.log(对象。是(x, y));// false ->使用'同值'相等 console.log ([x]其中(y));// true ->使用“相同值为零”的等式