7

http://wtfjs.com/最近的一篇文章中。一位作者在没有解释的情况下写了以下内容,这恰好是真的。

0 === -0 //returns true

我对 === 运算符的理解是,如果操作数指向同一个对象,它会返回 true。

此外,- 运算符返回对操作数负值的引用。使用此规则,0 和 -0 不应相同。

那么,为什么 0 === -0 呢?

4

3 回答 3

6

===并不总是意味着指向同一个对象。它在对象上执行,但在值类型上,它比较值。因此这是如何工作的:

var x = 0;
var y = 0;
var isTrue = (x === y);
document.write(isTrue); // true

JavaScript 使用 IEEE 浮点标准,其中 0 和 -0 是两个不同的数字,但是,ECMAScript 标准规定解析器必须将 0 和 -0 解释为相同:

§5.2(第 12 页)

数学运算,如加法、减法、否定、乘法、除法,以及本节后面定义的数学函数,应始终理解为计算数学实数的精确数学结果,不包括无穷大,也不包括负零区别于正零。本标准中对浮点运算进行建模的算法在必要时包括显式步骤,以处理无穷大和有符号零并执行舍入。如果将数学运算或函数应用于浮点数,则应将其理解为应用于该浮点数所表示的精确数学值;这样的浮点数必须是有限的,如果它是+0 或 -0 那么相应的数学值就是 0

于 2012-08-17T00:38:57.940 回答
5

事实上,即使在位级别上,0 和 -0 也不相同。但是,对于 +/-0 实施了一种特殊情况,因此它们比较相等。

=== 运算符在应用于原始数字时按值进行比较。

于 2012-08-17T00:40:02.770 回答
3

原始数字不是对象。您正在对数字进行值比较,而不是对对象进行身份比较。

正零等于负零。

===这是来自运算符的比较算法

如果 Type(x) 是 Number,那么

  • 如果 x 是 NaN,则返回 false。

  • 如果 y 是 NaN,则返回 false。

  • 如果 x 与 y 的数值相同,则返回 true。

  • 如果 x 为 +0 且 y 为 -0,则返回 true。

  • 如果 x 为 -0 且 y 为 +0,则返回 true。

  • 返回假。

于 2012-08-17T00:40:35.317 回答