在ECMAScript 5.1规范中,+0和-0是有区别的。

为什么+0 === -0的结果为真?


当前回答

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 ->使用“相同值为零”的等式

其他回答

维基百科有一篇很好的文章解释了这一现象:http://en.wikipedia.org/wiki/Signed_zero

简单地说,+0和-0都在IEEE浮点规范中定义。从技术上讲,它们都不同于不带符号的0,后者是整数,但实际上它们的结果都是0,因此在实际应用中,可以忽略这种区别。

我刚刚遇到了一个例子,其中+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。

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 ->使用“相同值为零”的等式

我将其归咎于严格相等比较方法('===')。 看4d部分

参见7.2.13规范严格相等比较

回答原来的题目+0和-0是一样的吗?:

brainslugs83(在Spudley回答的评论中)指出了一个重要的情况,在JS中+0和-0是不一样的-实现为函数:

var sign = function(x) {
    return 1 / x === 1 / Math.abs(x);
}

除了标准数学,这个会。返回+0和-0的正确符号。