我试图将数组中的每个值乘以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;
}
答案 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;
}
注释中的有用注释:由于oldArr
和arr
指向同一数组,因此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++){