Javascript 将一个数组与一个值相乘一个数?
为什么JavaScript允许将具有单个数值的数组与另一个数值相乘,或者与具有单个数值的另一个数组相乘Javascript 将一个数组与一个值相乘一个数?,javascript,Javascript,为什么JavaScript允许将具有单个数值的数组与另一个数值相乘,或者与具有单个数值的另一个数组相乘 [3] * 3; // 9 [3] * 2; // 6 [3] * [3]; // 9 [1, 2] * 2 // NaN 我希望每次都能返回NaN,但正如我在Chrome上的实验所证明的那样,情况并非如此 这是预期的行为吗?这种行为有意义吗?如果是,原因是什么?这里发生的事情是,[3]被强制转换成一个字符串类型,它只是“3”。然后在“3”*3中,字符串值“3”被转换为数字3。最后得到
[3] * 3;
// 9
[3] * 2;
// 6
[3] * [3];
// 9
[1, 2] * 2
// NaN
我希望每次都能返回NaN
,但正如我在Chrome上的实验所证明的那样,情况并非如此
这是预期的行为吗?这种行为有意义吗?如果是,原因是什么?这里发生的事情是,
[3]
被强制转换成一个字符串
类型,它只是“3”
。然后在“3”*3
中,字符串值“3”
被转换为数字3
。最后得到的结果是3*3
,其计算结果为9
如果执行[3],则可以看到此行为。toString()*3
或“3”*3
,这也会为您提供9
因此,需要执行以下步骤:
[3]*3
[3].toString()*3
“3”*3
编号(“3”)*3
3*3
9
在案例[1,2]
中,您最终会得到“1,2”
。但是Number(“1,2”)
产生NaN
,数字乘以NaN
产生NaN
[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怪胎;)开始并遵循路径乘法运算符=>ToNumber=>ToPrimitive=>[[DefaultValue]](number)=>valueOf=>toString
由于Array.prototype.valueOf不可用,它会返回到使用字符串版本(根据)
toString呈现一个数组,其中一个元素作为元素的值(因此[3]。toString()是3)我认为这是这里唯一可能的答案:)现在有了完美的意义……在我的u.clone方法的上下文中,我注意到了这种行为,它似乎是不受欢迎的(也许不是,我还没有决定):\uu.clone([1,2,3]],function(num){return num*2;})
其中回调应用于每个值,因此返回的结果是[2,4,6]
…我不想对抗我正在使用的语言,但在这种情况下,这种行为的结果似乎很麻烦。你认为如何?@Xaxis:我不明白克隆在这里的意思。它是map
?在任何情况下,JS都是弱类型的,如果你想强制严格键入,请添加显式类型检查:如果(typeof x==数字)…否则抛出(…)
Myclone
方法制作数组或对象的深度副本,并可选择对每个值调用回调函数……是的,我很清楚我可以执行类型检查,但这会限制方法回调函数仅处理数字值……无论如何,我非常感谢您的反馈!@Xaxis:如果是这种情况,我会将克隆([1,2,[3]])
的结果设置为[2,4,[6]]
,并对每个原语值调用回调。