[ ]+{ }
:一個數組加一個對象。
加法會進行隱式類型轉換,規則是調用其 valueOf () 或 toString () 以取得一個非對象的值 (primitive value)。
如果兩個值中的任何一個是字符串,則進行字符串串接,否則進行數字加法。[] 和 {} 的 valueOf () 都返回對象自身,所以都會調用 toString (),最後的結果是字符串串接。
[].toString () 返回空字符串,({ }).toString () 返回 "[object Object]",最後的結果就是 "[object Object]"。
{ }+[ ]
:看上去應該和上面一樣。
但是 {} 除了表示一個對象之外,也可以表示一個空的 bock。在 [] + { } 中,[ ] 被解析為數組,因此後續的 + 被解析為加法運算符,而 { } 就解析為對象。
但在 {} + [] 中,{ } 被解析為空的 bock,隨後的 + 被解析為正號運算符。即實際上成了:{∥empty block}+[ ],即對一個空數組執行正號運算,實際上就是把數組轉型為數字。首先調用.valueOf (),返回數組自身,不是 primitive value,因此繼續調用 [ ].toString (),返回空字符串。空字符串轉型為數字,返回 0,即最後的結果。