[ ]+{ }
:配列とオブジェクトの加算。
加算は暗黙の型変換を行い、そのルールは valueOf () または toString () を呼び出して非オブジェクトの値(プリミティブ値)を取得することです。
もし二つの値のいずれかが文字列であれば、文字列の連結が行われ、それ以外の場合は数値の加算が行われます。[] と {} の valueOf () はどちらもオブジェクト自身を返すため、toString () が呼び出され、最終的な結果は文字列の連結になります。
[].toString () は空の文字列を返し、({ }).toString () は "[object Object]" を返すため、最終的な結果は "[object Object]" になります。
{ }+[ ]
:見た目は上記と同じであるべきです。
しかし、{} はオブジェクトを表すだけでなく、空のブロックも表すことができます。[] + { } の場合、[ ] は配列として解析されるため、後続の + は加算演算子として解析され、{ } はオブジェクトとして解析されます。
しかし、{} + [] の場合、{ } は空のブロックとして解析され、後続の + は正号演算子として解析されます。つまり、実際には:{∥empty block}+[ ] となり、空の配列に対して正号演算が実行され、実際には配列が数値に変換されます。まず.valueOf () を呼び出し、配列自身を返しますが、これはプリミティブ値ではないため、[ ].toString () を続けて呼び出し、空の文字列を返します。空の文字列は数値に変換され、0 を返し、最終的な結果となります。