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