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

时间:2018-10-19 15:23:38

标签: 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.length;i++){
      oldArr.push(arr[i] * num);
   }
   return oldArr;
}

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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++){