JavaScript では、単一の数値を持つ配列を別の数値または単一の数値を持つ別の配列で乗算できるのはなぜですか?:
[3] * 3;
// 9
[3] * 2;
// 6
[3] * [3];
// 9
[1, 2] * 2
// NaN
NaN毎回返されることを期待していますが、Chrome での実験で実証されたように、そうではありません。
これは予想される動作ですか?この動作は理にかなっていますか? もしそうなら、なぜですか?
JavaScript では、単一の数値を持つ配列を別の数値または単一の数値を持つ別の配列で乗算できるのはなぜですか?:
[3] * 3;
// 9
[3] * 2;
// 6
[3] * [3];
// 9
[1, 2] * 2
// NaN
NaN毎回返されることを期待していますが、Chrome での実験で実証されたように、そうではありません。
これは予想される動作ですか?この動作は理にかなっていますか? もしそうなら、なぜですか?
[3] * 3;
次の手順が実行されます。
[3] => "3"Number("3") => 33 * 3与える9同様に、次の場合[1, 2] * 2:
[1, 2] => ""1,2"Number("1,2") => NaNNaN * 3与えるNaN私たちの中のECMAフリークのために;)ここから始めて、道をたどってくださいmultiplicative operator => ToNumber => ToPrimitive => [[DefaultValue]](number) => valueOf => toString
ここで起こっているのは、型[3]に強制されていることです。次に、値が数値に変換されます。最終的には になり、これは に評価されます。String"3""3" * 3String"3"33 * 39
[3].toString() * 3またはを実行すると、この動作が見"3" * 3られます9。
したがって、次の手順が行われます。
[3] * 3[3].toString() * 3"3" * 3Number("3") * 33 * 39の場合[1, 2]、最終的には になります"1, 2"。しかし、Number("1, 2")結果は であり、結果は でNaN乗算されます。NaNNaN
http://ecma-international.org/ecma-262/5.1/#sec-15.4.4.2
Array.prototype.valueOf が利用できないため、String バージョンの使用にフォールバックします ( http://ecma-international.org/ecma-262/5.1/#sec-9.9に従って) 。
toString は、要素の値として単一の要素を持つ配列をレンダリングします ([3].toString() は 3 です)。