当push()在for循环中运行时浏览器崩溃的原因如下所示[复制]

问题描述 投票:0回答:2

这个问题在这里已有答案:

我试图将数组中的每个值乘以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;
}
javascript for-loop push
2个回答
2
投票

尝试使用push()克隆数组而不是引用相同的数组,

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

function multipliedBy(arr, num){
   var oldArr = [...arr]; //clone using spread 
   for(var i=0;i<arr.length;i++){
      oldArr.push(arr[i] * num);
   }
   return oldArr;
}

评论中有用的注释:因为oldArrarr指向相同的数组,因此arr.length随每个.push()而变化 - Andreas


0
投票

当你做var oldArr = arr;时,它是对arr的引用。在循环中,你正在查看长度arr.length,当你推到oldArr时,你正在推动arr并且长度不断增加,所以你继续循环。

function multipliedBy(arr, num) {
  var oldArr = arr.slice(0);
  for (var i = 0; i < arr.length; i++) {
    oldArr.push(arr[i] * num);
  }
  return oldArr;
}

console.log(multipliedBy([1, 2, 3], 2))

或者,如果您不想克隆数组,那么在更改之前只需将其设置为变量即可。

var oldArr = arr;
var len = arr.length;
for(var i=0; i<len; i++){
© www.soinside.com 2019 - 2024. All rights reserved.