考慮空JavaScript數組:的JavaScript類型轉換
var a = [];
alert(a == false); // shows true
alert(!a); // shows false!
如何解釋呢? 規則是什麼?
考慮空JavaScript數組:的JavaScript類型轉換
var a = [];
alert(a == false); // shows true
alert(!a); // shows false!
如何解釋呢? 規則是什麼?
從http://forums.whirlpool.net.au/archive/966449:
a == false
:
在這種情況下,左手側的類型是對象,右手邊的類型是布爾值。 Javascript首先將布爾轉換爲數字,產生0
。然後它將對象轉換爲「基元」,產生空字符串。接下來,它將空字符串與0
進行比較。空字符串被轉換爲數字,產生0
,這在數字上等於右側的0
,因此整個表達式的結果是true
。
查看ECMAScript spec的§11.9.3瞭解所有血淋淋的細節。
(!a)
:
在這種情況下的Javascript轉換對象爲布爾真反,然後它,造成假。
!
運算符檢查其操作數是否爲「falsy」。
以下爲真:
!false
!0
!null
!NaN
!undefined
!""
==
運算符檢查鬆散平等,這與虛假無關。
具體而言,a == b
將轉換爲操作數爲數字,然後比較數字。
包含數字的字符串轉換爲它們包含的數字;布爾變換爲0
和1
。
如果已定義,則通過調用valueOf
來轉換對象。
因此,下列所有的都爲真:
"1" == 1
"0" == false
"1" == true
"2" != true
"2" != false
({ valueOf:function() { return 2; } }) == 2
({ valueOf:function() { return 1; } }) == true
當經由操作者==
比較對象爲原始值,對象脅迫到原始值本身(數字或字符串)。在這種情況下[]
強制轉換成0
,然後false
強制轉換成0
:
[] == false
0 == false
0 == 0
這是真的。
!
運算符強制爲布爾值,然後反轉該值。 []
布爾值是true
(與任何對象一樣)。然後反成爲false
![]
!true
false
的==
操作時,一個操作數,如果布爾,類型轉換對方號碼。
[] == 0;
等同於:
0 == 0;
你可以看到在規範的The Abstract Equality Comparison Algorithm的完整細節。
正如你可以看到,一個空數組對象,當轉換爲數字,產生0
:
+[]; // 0
Number(0);
這是真的,因爲它的toString方法產生一個空字符串,例如:
[].toString(); // ""
+""; // 0
Number(""); // 0
不知道這是否回答這個問題,但有一個新的庫來解決所有Javascript的類型錯誤:
在一句話中,Typecast解決了所有簡單問題,因此您可以專注於大型問題。通過在Javascript中爲強類型變量創建一個完整平臺,Typecast修復了Javascript的問題。
[爲什麼警告(!!「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
感謝您的指點。但不完全是,我要求通用規則。 – Evgenyt 2011-01-07 14:35:07
當涉及到鬆散的`==`運算符時,規則不是那麼通用。你應該閱讀[這個答案]引用的抽象平等比較算法(http://stackoverflow.com/questions/4626361/javascript-type-casting/4626420#4626420)。 – user113716 2011-01-07 14:39:47