[ ]+{ }
:一个配列にオブジェクトを追加します。
加法会进行隐式类型转换,规则是调用其 valueOf () 或 toString () 以取得一个非对象的值 (primitive value)。
如果两个值中的任何一个是字符串,则进行字符串串接,否则进行数字加法。[] 和 {} 的 valueOf () 都返回对象自身,所以都会调用 toString (),最后的结果是字符串串接。
[].toString () 返回空字符串,({ }).toString () 返回 "[object Object]",最后的结果就是 "[object Object]".
{ }+[ ]
:上記と同じように見えます。
しかし、{} はオブジェクトを表すだけでなく、空のブロックを表すこともできます。[] + { } では、[ ] は配列として解釈され、その後の + は加算演算子として解釈され、{ } はオブジェクトとして解釈されます。
しかし、{} + [] では、{ } は空のブロックとして解釈され、その後の + は正符号演算子として解釈されます。つまり、実際には:{∥empty block}+[ ]、空の配列に正符号演算を実行することになります。まず、valueOf () を呼び出し、配列自体を返し、primitive value ではないため、続けて [ ].toString () を呼び出し、空の文字列を返します。空の文字列を数値に変換すると、0 が返されます。つまり、最終的な結果は 0 です。