(少なくとも) Firefox Web コンソールと JSBin では、
> {} + []
0
> a = {} + []
"[object Object]"
"[object Object]"
どちらの場合もNode.js が返されます。仕様によると、どの動作が正しいですか? 最初の場合、なぜですか?
(少なくとも) Firefox Web コンソールと JSBin では、
> {} + []
0
> a = {} + []
"[object Object]"
"[object Object]"
どちらの場合もNode.js が返されます。仕様によると、どの動作が正しいですか? 最初の場合、なぜですか?
ブラウザー コンソールでは、前に a =
(またはコンテキストを変更する他のコード)がない場合、 はオブジェクト リテラルではなくblock{}
として扱われます。
ブロックは空なので、何もせず、+ []
.
単項プラス演算子は、配列を数値に変換し0
ます。
オブジェクトに対して演算子を使用する場合、javascript インタープリターは valueOf メソッドを使用して値をプリミティブにキャストする必要があります。これは、実際にはオブジェクトの内部 [[DefaultValue]] メソッドに型キャストを中継する内部 ToPrimitive 関数を使用します。
プラス演算子を使用した例は、演算子が数学の加算または文字列連結の両方として機能するため、少し注意が必要です。この場合、オブジェクトの文字列表現を連結します。
舞台裏で実際に起こっていることは次のとおりです。
a = {}.valueOf().toString() + [].valueOf().toString();
配列が空であるため、toString メソッドは空の文字列を返します。そのため、正しい結果は object.valueOf()toString() からの戻り値である [object Object] になります。