2011-01-07 54 views
5

考慮空JavaScript數組:的JavaScript類型轉換

var a = []; 
alert(a == false); // shows true 
alert(!a); // shows false! 

如何解釋呢? 規則是什麼?

+1

[爲什麼警告(!!「0」)和警報(false ==「0」)都可以在JavaScript中輸出true](http://stackoverflow.com/questions/4567393/why-do -alert0-and-alertfalse-0-both-output-true-in-javascript) – SLaks 2011-01-07 14:25:29

+1

感謝您的指點。但不完全是,我要求通用規則。 – Evgenyt 2011-01-07 14:35:07

+2

當涉及到鬆散的`==`運算符時,規則不是那麼通用。你應該閱讀[這個答案]引用的抽象平等比較算法(http://stackoverflow.com/questions/4626361/javascript-type-casting/4626420#4626420)。 – user113716 2011-01-07 14:39:47

回答

12

http://forums.whirlpool.net.au/archive/966449

a == false

在這種情況下,左手側的類型是對象,右手邊的類型是布爾值。 Javascript首先將布爾轉換爲數字,產生0。然後它將對象轉換爲「基元」,產生空字符串。接下來,它將空字符串與0進行比較。空字符串被轉換爲數字,產生0,這在數字上等於右側的0,因此整個表達式的結果是true

查看ECMAScript spec的§11.9.3瞭解所有血淋淋的細節。

(!a)

在這種情況下的Javascript轉換對象爲布爾真反,然後它,造成假。

8

!運算符檢查其操作數是否爲「falsy」。

以下爲真:

  • !false
  • !0
  • !null
  • !NaN
  • !undefined
  • !""

==運算符檢查鬆散平等,這與虛假無關。

具體而言,a == b將轉換爲操作數爲數字,然後比較數字。
包含數字的字符串轉換爲它們包含的數字;布爾變換爲01
如果已定義,則通過調用valueOf來轉換對象。

因此,下列所有的都爲真:

  • "1" == 1
  • "0" == false
  • "1" == true
  • "2" != true
  • "2" != false
  • ({ valueOf:function() { return 2; } }) == 2
  • ({ valueOf:function() { return 1; } }) == true
1

當經由操作者==比較對象爲原始值,對象脅迫到原始值本身(數字或字符串)。在這種情況下[]強制轉換成0,然後false強制轉換成0

[] == false 
0 == false 
0 == 0 

這是真的。

!運算符強制爲布爾值,然後反轉該值。 []布爾值是true(與任何對象一樣)。然後反成爲false

![] 
!true 
false 
4

==操作時,一個操作數,如果布爾,類型轉換對方號碼。

[] == 0; 

等同於:

0 == 0; 

你可以看到在規範的The Abstract Equality Comparison Algorithm的完整細節。

正如你可以看到,一個空數組對象,當轉換爲數字,產生0

+[]; // 0 
Number(0); 

這是真的,因爲它的toString方法產生一個空字符串,例如:

[].toString(); // "" 

+""; // 0 
Number(""); // 0 
0

不知道這是否回答這個問題,但有一個新的庫來解決所有Javascript的類型錯誤:

Typecast.js

在一句話中,Typecast解決了所有簡單問題,因此您可以專注於大型問題。通過在Javascript中爲強類型變量創建一個完整平臺,Typecast修復了Javascript的問題。