Javascript 为什么在如下所示的for循环中运行push()时浏览器会崩溃

Javascript 为什么在如下所示的for循环中运行push()时浏览器会崩溃,javascript,for-loop,push,Javascript,For Loop,Push,我试图将数组中的每个值乘以2,然后在每个循环中将该值推送到另一个数组中。我不知道为什么下面的代码似乎触发了一个无限循环,导致浏览器崩溃。我有其他的解决方案来获得同样的结果,但我只是想知道崩溃背后的根本原因,所以请教育我。谢谢 multipliedBy([1,2,3], 2) //expected result: [1,2,3,2,4,6] function multipliedBy(arr, num){ var oldArr = arr; for(var i=0;i<arr.

我试图将数组中的每个值乘以2,然后在每个循环中将该值推送到另一个数组中。我不知道为什么下面的代码似乎触发了一个无限循环,导致浏览器崩溃。我有其他的解决方案来获得同样的结果,但我只是想知道崩溃背后的根本原因,所以请教育我。谢谢

multipliedBy([1,2,3], 2) //expected result: [1,2,3,2,4,6]

function multipliedBy(arr, num){
   var oldArr = arr;
   for(var i=0;i<arr.length;i++){
      oldArr.push(arr[i] * num);
   }
   return oldArr;
}
multipledby([1,2,3],2)//预期结果:[1,2,3,2,4,6]
函数乘以(arr,num){
var oldArr=arr;

对于(var i=0;i当您执行
var oldArr=arr;
时,它是对
arr
的引用。在循环中,您查看的是长度
arr.length
,当您推到oldArr时,您推到arr,长度不断增加,因此您保持循环

函数乘以(arr,num){
var oldArr=arr.slice(0);
对于(变量i=0;iconsole.log(乘以([1,2,3,2])
当您执行
var oldArr=arr;
时,它是对
arr
的引用。在循环中,您查看的是长度
arr.length
,当您推到oldArr时,您推到arr,长度不断增加,因此您保持循环

函数乘以(arr,num){
var oldArr=arr.slice(0);
对于(变量i=0;ilog(乘以([1,2,3,2])
使用克隆数组,而不是在使用
push()时引用相同的数组

console.log(乘以([1,2,3],2))//预期结果:[1,2,3,2,4,6]
函数乘以(arr,num){
var oldArr=[…arr];//使用扩展进行克隆

对于(var i=0;i使用
push()
时,用克隆数组,而不是引用相同的数组

console.log(乘以([1,2,3],2))//预期结果:[1,2,3,2,4,6]
函数乘以(arr,num){
var oldArr=[…arr];//使用扩展进行克隆

for(var i=0;i因为
oldArr
arr
指向同一个数组,因此
arr.length
会随着
.push()的每一次变化而变化。
我知道这不是你要求的,但我会作为一行代码来做:
返回arr.concat(arr.map(elt=>elt*num))
谢谢大家!这些都是很好的答案。@Robin是的,我最终使用了map(),因为
oldArr
arr
指向同一个数组,因此
arr.length
每推一次
.push()
我知道这不是你要的,但我会这样做作为一行:
返回arr.concat(arr.map(elt=>elt*num))
谢谢大家!这些都是很好的答案。@Robin是的,我最终使用了map()