+0 和 -0 是一样的吗?
2022-08-30 01:11:51
通读 ECMAScript 5.1 规范,并加以区分。+0
-0
那么为什么评估为?+0 === -0
true
JavaScript使用IEEE 754标准来表示数字。来自维基百科:
有符号零为零,并带有关联的符号。在普通算术中,−0 = +0 = 0。然而,在计算中,一些数字表示允许存在两个零,通常用−0(负零)和+0(正零)表示。这发生在整数的某些有符号数字表示形式中,以及大多数浮点数表示形式中。数字 0 通常编码为 +0,但可以用 +0 或 −0 表示。
IEEE 754 浮点算术标准(目前大多数支持浮点数的计算机和编程语言都使用)需要 +0 和 −0。零可以被视为扩展实数线的变体,使得1/−0 = −∞和1/+0 = +∞,除以零仅未定义±0/±0和±∞/±∞。
本文包含有关不同表示形式的更多信息。
因此,从技术上讲,这就是为什么必须区分两个零的原因。
但是,计算结果为 true。为什么是(...)?
+0 === -0
此行为在 11.9.6 节“严格相等比较算法”中明确定义(部分强调我的):
比较 ,其中 和 是值,产生真或假。此类比较按如下方式执行:
x === y
x
y
(...)
如果 Type(x) 是 Number,则
- 如果 x 是 NaN,则返回 false。
- 如果 y 是 NaN,则返回 false。
- 如果 x 与 y 是相同的数字值,则返回 true。
- 如果 x 为 +0 且 y 为 −0,则返回 true。
- 如果 x 为 −0 且 y 为 +0,则返回 true。
- 返回 false。
(...)
(同样适用于 +0 == -0
btw。
从逻辑上讲,似乎平等对待和平等。否则,我们必须在代码中考虑到这一点,我个人不想这样做;)+0
-0
注意:
ES2015 引入了一种新的比较方法,Object.is
。 明确区分 和 :Object.is
-0
+0
Object.is(-0, +0); // false
我会添加这个作为答案,因为我忽略了@user113716的评论。
您可以通过执行以下操作来测试 -0:
function isMinusZero(value) {
return 1/value === -Infinity;
}
isMinusZero(0); // false
isMinusZero(-0); // true