前幾天我遇到了一個有趣的bug。我在測試一個數組,看它是否評估爲布爾值false,但只需直接評價它總是返回真:JavaScript數組的布爾值評估
> !![]
true
好了,所以基本上我把所有陣列會有true
不管,對不對?我在JavaScript控制檯中運行它只是爲了好玩:
> [] == true
false
這是怎麼回事?
前幾天我遇到了一個有趣的bug。我在測試一個數組,看它是否評估爲布爾值false,但只需直接評價它總是返回真:JavaScript數組的布爾值評估
> !![]
true
好了,所以基本上我把所有陣列會有true
不管,對不對?我在JavaScript控制檯中運行它只是爲了好玩:
> [] == true
false
這是怎麼回事?
它與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
。
關於這些問題,我想你會喜歡這個話題:https://www.destroyallsoftware.com/talks/wat –
你可能想看看你的答案這個問題:http:// stackoverflow .com/questions/5491605/javascript-empty-array-while-the-true-and-false-at-the-the-time- – Steve
你看過我的回答嗎? – plalx