+0 和 -0 是一样的吗?

2022-08-30 01:11:51

通读 ECMAScript 5.1 规范,并加以区分。+0-0

那么为什么评估为?+0 === -0true


答案 1

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 === yxy

(...)

  • 如果 Type(x) 是 Number,则

    1. 如果 x 是 NaN,则返回 false。
    2. 如果 y 是 NaN,则返回 false。
    3. 如果 x 与 y 是相同的数字值,则返回 true。
    4. 如果 x 为 +0 且 y 为 −0,则返回 true。
    5. 如果 x 为 −0 且 y 为 +0,则返回 true。
    6. 返回 false。

(...)

(同样适用于 +0 == -0 btw。

从逻辑上讲,似乎平等对待和平等。否则,我们必须在代码中考虑到这一点,我个人不想这样做;)+0-0


注意:

ES2015 引入了一种新的比较方法,Object.is。 明确区分 和 :Object.is-0+0

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

答案 2

我会添加这个作为答案,因为我忽略了@user113716的评论。

您可以通过执行以下操作来测试 -0:

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

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