6

JavaScript では、単一の数値を持つ配列を別の数値または単一の数値を持つ別の配列で乗算できるのはなぜですか?:

[3] * 3;
// 9

[3] * 2;
// 6

[3] * [3];
// 9

[1, 2] * 2
// NaN

NaN毎回返されることを期待していますが、Chrome での実験で実証されたように、そうではありません。

これは予想される動作ですか?この動作は理にかなっていますか? もしそうなら、なぜですか?

4

3 に答える 3

9
[3] * 3;

次の手順が実行されます。

  • 配列は文字列に変換されます[3] => "3"
  • 文字列は数値に変換されますNumber("3") => 3
  • 3 * 3与える9

同様に、次の場合[1, 2] * 2:

  • 配列は文字列に変換されます[1, 2] => ""1,2"
  • 文字列は数値に変換されますNumber("1,2") => NaN
  • NaN * 3与えるNaN

私たちの中のECMAフリークのために;)ここから始めて、道をたどってくださいmultiplicative operator => ToNumber => ToPrimitive => [[DefaultValue]](number) => valueOf => toString

于 2013-06-25T15:54:15.200 に答える
3

ここで起こっているのは、型[3]に強制されていることです。次に、値が数値に変換されます。最終的には になり、これは に評価されます。String"3""3" * 3String"3"33 * 39

[3].toString() * 3またはを実行すると、この動作が見"3" * 3られます9

したがって、次の手順が行われます。

  • [3] * 3
  • [3].toString() * 3
  • "3" * 3
  • Number("3") * 3
  • 3 * 3
  • 9

の場合[1, 2]、最終的には になります"1, 2"。しかし、Number("1, 2")結果は であり、結果は でNaN乗算されます。NaNNaN

于 2013-06-25T15:54:07.050 に答える
1

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 です)。

于 2013-06-25T15:57:11.037 に答える