2012-08-17 101 views
7

在最近的帖子http://wtfjs.com/。一位作者在没有解释的情况下写道,这恰好是真的。为什么JavaScript中的“0 === -0”为true?

0 === -0 //returns true 

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

此外, - 运算符返回对操作数的负值的引用。有了这个规则,0和-0不应该是相同的。

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

回答

5

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

当应用于基本数字时,===运算符按值进行比较。

+0

它们的不完全相同,但两者是相同的。 – 2012-08-17 00:41:32

+0

@ColeJohnson我忘记了一下补码。 JavaScript使用IEEE 64位浮点数作为补码。 – 2012-08-17 00:43:03

+0

所以它似乎在JavaScript中处理特殊情况。 – riship89 2012-08-17 00:47:18

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页)

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

+0

所以,它是在JavaScript或负数实现一种特殊情况使用2的补数进行评估? – riship89 2012-08-17 00:45:55

+0

@ hrishikeshp19 IEEE浮点标准是除了这个以外的补充。 – 2012-08-17 00:46:53

+0

这不仅仅是解析器。 'a === -a',其中a为0则返回true。 – 2012-08-17 00:47:45

3

原始数字不是对象。你正在做数值比较,而不是对象的身份比较。

正零等于负零。

这是从比较算法为===操作

如果Type(x)是号码,然后

  • 如果x是NaN,返回false。

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

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

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

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

  • 返回false。

+2

+1。因为-0实际上是JavaScript中的一个数字(由于所有数字都是IEEE-754浮点数,可以表示负数零)。它被定义为等于0,所以人们不会发疯。 – 2012-08-17 00:49:23