通过阅读的ECMAScript 5.1规范,+0和-0被区分。
+0
-0
那为什么要+0 === -0评估true?
+0 === -0
true
JavaScript使用IEEE754标准表示数字。:
有符号的零 为零,具有相关的符号。在普通算术中,-0 = +0 =0。但是,在计算中,某些数字表示形式允许存在两个零,通常用 -0(负零) 和 +0(正零)表示 。这在某些带符号的整数表示形式以及大多数浮点数表示形式中都会发生。数字0通常被编码为+0,但是可以用+0或-0表示。 用于浮点算术的IEEE 754标准(当前由支持浮点数的大多数计算机和编程语言所使用)都需要+0和-0。零可被视为扩展实数线的变体,因此1 / −0 =-∞和1 / + 0 = +∞,仅对±0 /±0和±∞/±∞未定义以零除。
有符号的零 为零,具有相关的符号。在普通算术中,-0 = +0 =0。但是,在计算中,某些数字表示形式允许存在两个零,通常用 -0(负零) 和 +0(正零)表示 。这在某些带符号的整数表示形式以及大多数浮点数表示形式中都会发生。数字0通常被编码为+0,但是可以用+0或-0表示。
用于浮点算术的IEEE 754标准(当前由支持浮点数的大多数计算机和编程语言所使用)都需要+0和-0。零可被视为扩展实数线的变体,因此1 / −0 =-∞和1 / + 0 = +∞,仅对±0 /±0和±∞/±∞未定义以零除。
本文包含有关不同表示形式的更多信息。
因此,这就是为什么必须从技术上区分两个零的原因。
但是,+0 === -0计算结果为true。这是为什么 (…) ?
此行为在第11.9.6节 “ 严格平等比较算法”中 有明确定义(部分强调是我的):
比较x === y,其中x和y是值,产生 true 或 false 。这样的比较执行如下: (…) 如果Type(x)是Number,则 如果x为NaN,则返回false。 如果y为NaN,则返回false。 如果x与y相同,则返回true。 如果x为+ 0,y为−0,则返回true。 如果x为−0,y为+0,则返回true。 返回false。 (…)
比较x === y,其中x和y是值,产生 true 或 false 。这样的比较执行如下:
x === y
x
y
(…)
如果Type(x)是Number,则
(+0 == -0顺便说一句也是如此。)
+0 == -0
从逻辑上看+0,-0应平等对待。否则,我们将不得不在我们的代码中考虑到这一点,而我个人不想这样做;)
注意:
ES2015引入了一种新的比较方法Object.is。Object.is明确区分-0和+0:
Object.is
Object.is(-0, +0); // false