2016-11-15 76 views
4

我在發現JavaScript比較的機率。我想找到一個比較棘手的例子,以及在某些情況下如何導致錯誤。爲什麼在JavaScript中undefined不等於零?

我想過一些輸入變量保持未定義的例子,並將其與零比較。因爲不確定是假的時,轉換爲布爾和零爲假時,轉換爲布爾我決定測試一下下面的代碼:

var x; 
//Here x should be initialized but due to some circumstances is not 
if(x == 0){ 
    //This should run 
} 

令人驚訝的...

Boolean(undefined) //false 
Boolean(0) //false 
x //undefined 
x == 0 //false 

爲什麼它是這樣呢?

+5

既然'1'和'2'都是真的,你會期望'1 == 2'是'true'嗎? –

+2

你期待什麼樣的答案超越「因爲規格說明」? http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 – Quentin

+0

那麼'未定義!= 0',我想那就是它。請參閱此處以獲取JS比較的完整列表:https://dorey.github.io/JavaScript-Equality-Table/ –

回答

6

此行爲是在本說明書中對於The Abstract Equality Comparison Algorithm

從說明書

比較x == y,其中xy是值,產生真或假。按照如下進行這樣的比較:

  1. 如果Type(x)相同Type(y),然後... ...

  2. 如果x爲null,並且y是不確定的,返回true。

  3. 如果x未定義,並且ynull,則返回true。
  4. 如果Type(x)是Number並且Type(y)是String,則返回comparison x == ToNumber(y)的結果。
  5. 如果Type(x)是String並且Type(y)是Number,則返回比較結果ToNumber(x) == y
  6. 如果Type(x)爲布爾型,則返回比較結果ToNumber(x) == y
  7. 如果Type(y)爲布爾值,則返回比較結果x == ToNumber(y)
  8. 如果Type(x)是字符串或數字,並且Type(y)是Object,則返回comparison x == ToPrimitive(y)的結果。
  9. 如果Type(x)是Object且Type(y)是字符串或數字,則返回比較結果ToPrimitive(x) == y
  10. 返回false。

由於undefined等一批0是不是同一類型的,它只是在第三點提到它做什麼,如果左邊是undefined
然後,如果右側是null,它將返回任何其他值,並直接輸入10.,它將顯示「return false」。

+0

哇!太棒了。如果我將未定義的變量與已知「已知類型」(可以這麼說)的任何變量進行比較,它會嘗試將undefined轉換爲該類型嗎? – Landeeyo

+1

@Landeeyo - 實際上不是,它有點複雜,規範有這個答案,我發佈了一些草率,讓我編輯。 – adeneo

+0

這部分規範是驚人的。很好的答案。萬分感謝! – Landeeyo

-6

這不是深刻的平等。 如果要比較的價值,你可以使用類型三重「=」

if(x === 0){ 
    //This should run 
} 

否則未定義== NULL等。

+0

這並不回答問題。 –

0
Boolean(undefined) //false 
Boolean(0) //false 

實際上,Boolean函數返回false所有非真實值,如0,null,未定義 「」(空字符串)等

這並不意味着undefined == 0

相關問題