2012-08-17 99 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