2015-08-08 55 views
0

在大衛·弗拉納根的JavaScript指導,有一種說法:的Javascript平等運營商

==操作符從未嘗試轉換其操作數爲布爾

所以我在這裏做了一個小測試:

var a = false; 
var b = ""; // empty string 
a == b; //returns true 

看着Abstract Equality Comparison Algorithm有一點:

e。如果Type(x)是布爾值,則返回true,如果x和y都爲真或兩者都爲假。否則,返回false。

如果y是字符串數據類型(無轉換),x和y如何都是真?

+0

「如果類型(x)是布爾值,返回的比較ToNumber(X)== y的結果」。如果類型(x)是數字和類型(y)是字符串, 返回比較結果x == ToNumber(y)。「 – zerkms

+0

相關:http://algorithmicassertions.com/visualization/2014/03/27/Better-JS-Equality-Table.html和http://www.impressivewebs.com/why-use-triple-equals-javascipt/。 – jarmod

回答

5

引擎蓋下會發生什麼事是

如果Type(x)Boolean,回報比較ToNumber(x) == y的結果。

Number(false) == "" 

隨後

如果Type(x)NumberType(y)String,返回的比較x == ToNumber(y)的結果。

Number(false) == Number("") -> 0 == 0 

x和y如何既可以是真,如果y是字符串數據類型(無需轉換)?

它們不是都是true,但在類型強制後它們的值是相等的。

==操作符從未嘗試轉換其操作數爲布爾

這是正確的,如果你檢查比較算法,你會發現,類型從隱式現澆到Boolean

參考文獻:

+0

感謝您指出我的錯誤 - 我明顯誤解了這個問題。 +1 *實際*答案。;) – johnnyRose

+0

小問題。雖然平等運營商本身不做任何轉換,但ToNumber確實如此。由於平等運算符使用ToNumber函數,在技術上這不等於平等運算符轉換? –

+0

@AlexanderK。它會將傳遞的值隱式轉換爲一般類型,這是正確的。 – zerkms