为什么JavaScript允许您将数组与单个数值乘以另一个数值或另一个具有单个数值的数组?:
[3] * 3;
// 9
[3] * 2;
// 6
[3] * [3];
// 9
[1, 2] * 2
// NaN
我希望每次都会返回NaN
,但正如我在Chrome中的实验所证明的那样并非如此。
这是预期的行为吗?这种行为有意义吗?如果是这样,为什么?
答案 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" * 3
中String
值"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)