JSの中の{}+[]と[]+{}について話してください.


JSの中の{}+[]と[]+{}について話してください.
まず、なぜこのような問題があるのかを話します.これはjsの弱いタイプが原因で、jsの弱いタイプが、jsの暗黙的なタイプへの転換が頻繁に発生します.例えば、タイトルの{} + [][] + {}のように、そのタイプは全く予測できません.
まず、jsの隠れ家のruleを見てみます.jsは足し算をする時、先に二つの操作数がnumberかどうかを推測します.もしそうなら、そのまま足して結果を出します.一つの操作数がstringであれば、もう一つの操作数が暗黙的にstringに変換され、文字列スティッチングを行って結果が得られます.操作数がオブジェクトや配列といった複雑なデータの種類であれば、両方の操作数を文字列に変換してスティッチングします.操作数がブーメランのような単純なデータの種類であれば、動作数をnumberに変換して加算します.
これらのルールを知ったら簡単です.
まず第一の[] + {}を見てみます.これは二つの複雑なデータ構造の加算の例です.上のruleによって、まず二つの操作数をstringに変換してからスティッチングします.
[] -----> ''
{} -----> '[object Object]'

[] + {} = '[object Object]'
第二の{} + []を見てください.これも二つの複雑なデータ構造が加算された例です.第一と大差がないようです.もちろん[object Object]であるはずですが、加算すると、答えは0です.
これはなぜですか?
なぜなら、js解釈器によっては、先頭の{}を一つのコードブロックではなく、一つのjsオブジェクトと見なしていますので、本当に演算に参加するのは+[]です.つまり、numberに変換して、答えが0になります.
では、私たちはどうやって{}をjsオブジェクトではなくコードブロックとして認識することができますか?簡単です.{}に文を書いてもいいです.
{console.log("hello")} + [] 
//hello
//0