在http://wtfjs.com/最近的一篇文章中。一位作者在没有解释的情况下写了以下内容,这恰好是真的。
0 === -0 //returns true
我对 === 运算符的理解是,如果操作数指向同一个对象,它会返回 true。
此外,- 运算符返回对操作数负值的引用。使用此规则,0 和 -0 不应相同。
那么,为什么 0 === -0 呢?
在http://wtfjs.com/最近的一篇文章中。一位作者在没有解释的情况下写了以下内容,这恰好是真的。
0 === -0 //returns true
我对 === 运算符的理解是,如果操作数指向同一个对象,它会返回 true。
此外,- 运算符返回对操作数负值的引用。使用此规则,0 和 -0 不应相同。
那么,为什么 0 === -0 呢?
===
并不总是意味着指向同一个对象。它在对象上执行,但在值类型上,它比较值。因此这是如何工作的:
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。
事实上,即使在位级别上,0 和 -0 也不相同。但是,对于 +/-0 实施了一种特殊情况,因此它们比较相等。
=== 运算符在应用于原始数字时按值进行比较。
原始数字不是对象。您正在对数字进行值比较,而不是对对象进行身份比较。
正零等于负零。
===
这是来自运算符的比较算法
如果 Type(x) 是 Number,那么
如果 x 是 NaN,则返回 false。
如果 y 是 NaN,则返回 false。
如果 x 与 y 的数值相同,则返回 true。
如果 x 为 +0 且 y 为 -0,则返回 true。
如果 x 为 -0 且 y 为 +0,则返回 true。
返回假。