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

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


当前回答

0有两种可能的值(位表示)。这不是唯一的。特别是在浮点数中,这种情况可能发生。这是因为浮点数实际上被存储为一种公式。

整数也可以以不同的方式存储。您可以使用带有额外符号位的数值,因此在16位空间中,可以存储15位整数值和符号位。在这种表示中,值1000(十六进制)和0000都是0,但其中一个是+0,另一个是-0。

这可以通过从整数值中减去1来避免,因此它的范围从-1到-2^16,但这将是不方便的。

一个更常见的方法是将整数存储在“两个补体”中,但显然ECMAscript没有选择这样做。在这种方法中,数字范围从0000到7FFF正。负数从FFFF(-1)到8000。

当然,同样的规则也适用于更大的整数,但我不希望F变弱。;)

其他回答

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

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

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

参见7.2.13规范严格相等比较

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

我们可以使用Object。就是区分+0和-0,还有一点,NaN==NaN。

Object.is(+0,-0) //false

Object.is(NaN,NaN) //true

我将添加这个作为答案,因为我忽略了@user113716的注释。

你可以这样测试-0:

function isMinusZero(value) {
  return 1/value === -Infinity;
}

isMinusZero(0); // false
isMinusZero(-0); // true