2013-09-26 81 views
3

前幾天我遇到了一個有趣的bug。我在測試一個數組,看它是否評估爲布爾值false,但只需直接評價它總是返回真:JavaScript數組的布爾值評估

> !![] 
    true 

好了,所以基本上我把所有陣列會有true不管,對不對?我在JavaScript控制檯中運行它只是爲了好玩:

> [] == true 
    false 

這是怎麼回事?

+1

關於這些問題,我想你會喜歡這個話題:https://www.destroyallsoftware.com/talks/wat –

+0

你可能想看看你的答案這個問題:http:// stackoverflow .com/questions/5491605/javascript-empty-array-while-the-true-and-false-at-the-the-time- – Steve

+0

你看過我的回答嗎? – plalx

回答

1

它與The Abstract Equality Comparison Algorithm對比用於將值轉換爲布爾值的算法。

通過查看the spec,我們可以看到點數是定義什麼應該發生時類型(左側值)爲對象唯一的一個。但是,它指定右側的值必須是字符串或數字

9。如果Type(x)是Object且Type(y)是String或Number,則 會返回比較結果ToPrimitive(x)== y。

看着[] == true

typeof []'object',所以我們都很好,但typeof true不是'string''number',它是​​,所以這回退到最後一條語句,點數

10。返回false。

然而!![]轉化爲!!Boolean([]),並且由於[]是thruty值(對象),它是相同的象寫!!true,它返回true