誰かがなぜこれらの結果が得られたのか説明できますか?
これは本当の問題ではないことはわかっていますが、知りたいです。
ありがとう
これ+
は、数値と文字列を加算するためのものであり、単項演算子でもあります。また{}
、 が空のオブジェクトであり、ブロック ステートメントでもあるためです。
これは説明できます。
[] + {}
どちらも文字列に変換されます。
[].toString() + {}.toString()
[].toString()
は、[].join('')
と同じなので、最初のものはです。{}.toString()
'[object Object]'
[object Object]
2番目のものはもっと混乱しています。
{} + []
ここ{}
はオブジェクトとして解釈されず、空のブロックとして解釈されます。そのため、内部のコードが実行されます。内部には何もないので何もせず、次のステートメントが実行されます: +[]
. これにより、配列が int に変換されます。最初に it よりも文字列に変換されます。
{} + [] => +[] => +([].toString()) => 0
を括弧に入れる{}
と、最初と同じになります。
({}) + [] => '[object Object]'
[] + []
加算演算子を使用する場合、左オペランドと右オペランドの両方が最初にプリミティブに変換されます ( §11.6.1 )。§9.1に従って、オブジェクト (この場合は配列) をプリミティブに変換すると、そのデフォルト値が返されます。これは、有効な
toString()
メソッドを持つオブジェクトの場合、呼び出しの結果ですobject.toString()
( §8.12.8 )。配列の場合、これは呼び出しと同じですarray.join()
([§15.4.4.2][4])。空の配列を結合すると空の文字列になるため、加算演算子のステップ #7 は 2 つの空の文字列を連結したもの、つまり空の文字列を返します。
[] + {}
と同様に
[] + []
、両方のオペランドが最初にプリミティブに変換されます。「オブジェクト オブジェクト」(§15.2) の場合、これも を呼び出した結果でありobject.toString()
、null 以外、未定義でないオブジェクトの場合は"[object Object]"
([§15.2.4.2][5]) です。
{} + []
here はオブジェクトとして解析されるの
{}
ではなく、代わりに空のブロックとして解析されます ([§12.1][6]、少なくともそのステートメントを式にすることを強制しない限り、それについては後で詳しく説明します)。空のブロックの戻り値は空であるため、そのステートメントの結果は と同じ+[]
です。単項+
演算子 ([§11.4.6][7]) は を返しますToNumber(ToPrimitive(operand))
。すでにわかっているように、ToPrimitive([])
は空の文字列であり、[§9.3.1][8] によればToNumber("")
0 です。
{} + {}
前のケースと同様に、最初
{}
は空の戻り値を持つブロックとして解析されます。ここでも、は、および と+{}
同じ です( を参照)。の結果を得るには、文字列に適用する必要があります。[§9.3.1][9] の手順に従うと、次の結果が得られます。ToNumber(ToPrimitive({}))
ToPrimitive({})
"[object Object]"
[] + {}
+{}
ToNumber
"[object Object]"
NaN
文法が String をStringNumericLiteralの展開として解釈できない場合、 [ToNumber][10] の結果はNaNになります。
Array(16).join("wat" - 1)
[§15.4.1.1][11] および [§15.4.2.2][12] に従って
Array(16)
、長さ 16 の新しい配列を作成します。結合する引数の値を取得するには、[§11.6.2][13] の手順を実行します。 #5 と #6 は、 を使用して両方のオペランドを数値に変換する必要があることを示していますToNumber
。ToNumber(1)
単純に 1 ([§9.3][14]) ですが、これToNumber("wat")
もNaN
[§9.3.1][15] のとおりです。[§11.6.2][16] のステップ 7 に続いて、[§11.6.3][17] は、いずれかのオペランドがNaNの場合、結果はNaNになります。
したがって、への引数
Array(16).join
は ですNaN
。§15.4.4.5 ( ) に従って、 ([§9.8.1][18])である引数Array.prototype.join
を呼び出す必要があります。ToString
"NaN"
mがNaNの場合、 String を返し
"NaN"
ます。[§15.4.4.5][19] のステップ 10 に従って、
"NaN"
と空の文字列の連結を 15 回繰り返します。これは、表示されている結果と同じです。"wat" + 1
引数としての代わりに使用する"wat" - 1
と、加算演算子は数値1
に変換する代わりに文字列に変換する"wat"
ため、効果的に を呼び出しますArray(16).join("wat1")
。