2012-10-05 50 views
4

我碰到以下無法理解的原因,有誰能解釋一下嗎?javascript比較危機

var foo = [0]; 
console.log(foo == !foo); // true 
console.log(foo == foo); // true 
+2

的https:// WWW。 destroyallsoftware.com/talks/wat :-) – Alex

+2

作爲一個附註 - 在JavaScript中,當使用==作爲比較時,您通常會得到意想不到的結果。您應該始終使用===,因爲它不使用類型轉換。 – PhillipKregg

+0

類型強制:http://webreflection.blogspot.com/2010/10/javascript-coercion-demystified.html – Mathletics

回答

6

第二個比較很容易解釋:foo等於自己。

第一個,但是,是一個有點棘手:foo是一個數組,它是一個對象,該對象的計算結果爲truecoerced to boolean。所以!foofalse。但比較左側的foo未被轉換爲布爾值。兩個操作數在平等比較期間實際上轉換爲數字。這是如何計算:

[0] == false 
[0] == 0 
"0" == 0 
0 == 0 
true 

MDN,與相等運算符==比較:

如果兩個操作數是不一樣的類型,JavaScript的轉換操作數則實行嚴格的比較。如果任一操作數是數字或布爾值,則操作數將盡可能地轉換爲數字

我知道這個解釋聽起來很膚淺。它實際上比這更復雜,但基本步驟是我上面列出的那些。您可以在ECMA-262規範中看到詳細信息,特別是在章節911.9上。

+2

是啊,那就是我得到的 – saml