将数组与单个值乘以数字?

时间:2013-06-25 15:51:49

标签: javascript

为什么JavaScript允许您将数组与单个数值乘以另一个数值或另一个具有单个数值的数组?:

[3] * 3;
// 9

[3] * 2;
// 6

[3] * [3];
// 9

[1, 2] * 2
// NaN

我希望每次都会返回NaN,但正如我在Chrome中的实验所证明的那样并非如此。

这是预期的行为吗?这种行为有意义吗?如果是这样,为什么?

3 个答案:

答案 0 :(得分: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我们中间的怪人;)开始here并按照路径multiplicative operator => ToNumber => ToPrimitive => [[DefaultValue]](number) => valueOf => toString

答案 1 :(得分:3)

这里发生的事情是[3]被强制转换为String类型,只有"3"。然后在"3" * 3String"3"转换为数字3。您最终得到3 * 3,其结果为9

如果您执行[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,而数字乘以NaN会产生NaN

答案 2 :(得分: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)