42

重複の可能性:
CodeMash 2012の「Wat」トークで言及されているこれらの奇妙なJavaScriptの動作の説明は何ですか?

[]文字列に強制変換されると空の文字列("")が返され、文字列に強制変換されると。が返されることを私は知って{}います"[object Object]"

ブラウザのJavascriptコンソールで実行する[] + {}と、期待どおりに戻ります。

>> [] + {}
"[object Object]"

しかし、実行する{} + []と、まったく予期しない値が返されます。

>> {} + []
0

何が原因で戻ってきたの0でしょうか?

4

3 に答える 3

68

ステートメントの先頭に aが{ある場合、それはブロックとして解釈され、0 個以上のステートメントが含まれる場合があります。ステートメントが含まれていないブロックの継続値は空になります。

つまり、この場合、{}は空のコード ブロックとして解釈されます。

ステートメントは終了ブレース の後に終了します}。これは、次の 3 文字+[]が独自のステートメントを構成することを意味します。

式またはステートメントの先頭に+は単項プラス演算子があり、オペランドを強制的に数値にします。

So+[]は と同じでNumber([])、これは に評価され0ます。

つまり、{} + []空のコード ブロックの後に、数値に強制された配列が続きます。


つまり{} + [] 、式内で評価すると、期待どおりの結果が返されます。

>> ({} + []) 
"[object Object]" 

もう 1 つの興味深い点は、オブジェクト リテラルでステートメントを開始できないことです。これは、インタプリタがステートメントをステートメントとして解析しようとするためです。これを行う

{ "object": "literal" };

構文エラーをスローします。

于 2012-08-13T17:12:34.913 に答える
20

{}はブロックとして扱われるためです。したがって、あなたの声明は実際には次のとおりです。

{

//empty block here
}

+[] //0 same as Number([])

これが無効な JavaScript である理由です。

eval('{hello: "world", key: "value"}') //Syntax error

() を追加して式にすることができます (ブロックは式で使用できないため、オブジェクト初期化子になります:

eval('({hello: "world", key: "value"})') //Object
于 2012-08-13T17:12:08.377 に答える
2

空のブロックは強制的にゼロになります。次に、+オペレーターは を数値に強制することを決定し[]ます。

于 2012-08-13T17:14:46.460 に答える