为什么当 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;
}
来自评论的有用说明: 因为 oldArr
和 arr
指向同一个数组,因此 arr.length
每 [=15] 变化一次=] - 安德烈亚斯
我试图将数组中的每个值乘以 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;
}
来自评论的有用说明: 因为 oldArr
和 arr
指向同一个数组,因此 arr.length
每 [=15] 变化一次=] - 安德烈亚斯