使用For...Of循环改变数组

5

寻找一个资源来解释为什么当我运行以下代码时,我的原始数组不会改变。

arr = [1,2,3,4];
for(let val of arr){
  val = val * 2;
  console.log(val);
}
console.log(arr);

我正在学习for...in和for...of循环,但不确定为什么我的console.log(arr)没有打印出[2,4,6,8]。


因为您正在更改val而不是数组本身中的任何内容。 - Jaromanda X
你没有将新值设置回数组中。这就是原因。 - Munish Chechi
4个回答

2
这里的问题在于标识符val被覆盖了。每次迭代循环时,都会调用另一个整数并将其赋值给val,因此val只是一个临时变量。如果您使用了对象,并且没有重新分配变量,则您的值将保持不变。
// Object values
var x = [{z:1},{z:2}]
for(let y of x){
    // No reassignment
    y.z=3;
}
console.log(x); //[{"z":3},{"z":3}]

如果您想直接修改一个简单类型的数组,可以这样做:
var q = [5,6,7];
for( i in q){
    q[i] = q[i] * 2;
}
console.log(q); //[10, 12, 14]

谢谢。现在这个意思更清晰了。 - Jacob

2
你正在进行修改而不是插入操作。
最好使用for each循环。这样你就可以修改数组了。使用of会使事情变得复杂。

arr = [1,2,3,4];
arr.forEach(function(part, index, array) {
   array[index] = array[index]*2;
   });
console.log(arr);


不应该在数组迭代中使用for..in。它会循环原型链,导致意外的结果。 - sabithpocker
1
@sabithpocker 是的,没错。但在这种特定情况下它不会出错。为了让它变得100%正确,使用for each。 - Suresh Atta
酷啊,昨天回答了一个类似的问题,所以这个问题一直在我脑海中。 - sabithpocker
@sabithpocker 你需要说“所以这个卡住了我的思维。” - Tim Biegeleisen

2
使用for循环,可以使得赋值在原始数组中“保留”。

arr = [1,2,3,4];
for (var i=0; i < arr.length; i++) { 
    arr[i] = 2*arr[i];
    console.log(arr[i]);
}

你最初所做的事情存在问题,因为val只是一个变量,与底层数组没有实际联系。因此,将val加倍对数组本身没有影响。

非常感谢!我很感激您抽出时间来帮助解答我的问题。 - Jacob

1
你可以使用forEach来实现这一点,它会在数组中的每个值上运行特定的函数。

arr = [1,2,3,4];
arr.forEach((d, i, arr) => arr[i]*=2);
console.log(arr);


感谢您抽出时间向我解释这个问题! - Jacob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接