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

why browser crashes when push() is run within a for loop like below

我试图将数组中的每个值乘以 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;
}

当您执行 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++){

像这样尝试使用克隆数组,而不是在使用push()、[=16时引用相同数组=]

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 每 [=15] 变化一次=] - 安德烈亚斯