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

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


当前回答

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

你可以这样测试-0:

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

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

其他回答

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

参见7.2.13规范严格相等比较

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

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

Object.is(NaN,NaN) //true

JavaScript使用IEEE 754标准来表示数字。从维基百科:

Signed zero is zero with an associated sign. In ordinary arithmetic, −0 = +0 = 0. However, in computing, some number representations allow for the existence of two zeros, often denoted by −0 (negative zero) and +0 (positive zero). This occurs in some signed number representations for integers, and in most floating point number representations. The number 0 is usually encoded as +0, but can be represented by either +0 or −0. The IEEE 754 standard for floating point arithmetic (presently used by most computers and programming languages that support floating point numbers) requires both +0 and −0. The zeroes can be considered as a variant of the extended real number line such that 1/−0 = −∞ and 1/+0 = +∞, division by zero is only undefined for ±0/±0 and ±∞/±∞.

本文包含关于不同表示形式的进一步信息。

这就是为什么,技术上讲,两个0都要区分。

但是,+0 === -0的结果为true。为什么会这样?

这种行为在第11.9.6节严格相等比较算法中明确定义(重点部分是我的):

比较x === y,其中x和y为值,产生true或false。这样的比较如下: (…) 如果Type(x)是Number,则 如果x为NaN,则返回false。 如果y是NaN,返回false。 如果x与y的Number值相同,则返回true。 如果x为+0,y为−0,则返回true。 如果x为−0,y为+0,则返回true。 返回false。 (…)

(顺便说一句,+0 == -0也是如此。)

把+0和-0视为相等似乎是合乎逻辑的。否则,我们将不得不在我们的代码中考虑到这一点,我个人不想这样做;)


注意:

ES2015引入了一个新的比较方法Object.is。对象。显式区分-0和+0:

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

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

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

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

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

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

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

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

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

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