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