Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将一个数组与一个值相乘一个数?_Javascript - Fatal编程技术网

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。最后得到

为什么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],则可以看到此行为。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==数字)…否则抛出(…)
My
clone
方法制作数组或对象的深度副本,并可选择对每个值调用回调函数……是的,我很清楚我可以执行类型检查,但这会限制方法回调函数仅处理数字值……无论如何,我非常感谢您的反馈!@Xaxis:如果是这种情况,我会将
克隆([1,2,[3]])
的结果设置为
[2,4,[6]]
,并对每个原语值调用回调。