为什么JavaScript中的“0 === -0”为真?

时间:2012-08-17 00:36:19

标签: javascript numbers operators zero

最近发表于http://wtfjs.com/的帖子。一位作者在没有解释的情况下撰写以下内容,这恰好是真实的。

0 === -0 //returns true

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

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

  

§5.2(第12页)

     

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

答案 1 :(得分:5)

实际上,即使在位级别,0和-0也不相同。但是,有一个特殊情况为+/- 0实现,因此它们相等。

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

答案 2 :(得分:3)

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

正零等于负零。

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

  

如果Type(x)是Number,那么

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

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

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

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

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

  •   
  • 返回false。

  •