var arr = ['Foo'];
arr.forEach(function(item){
console.log(item);
item = 'Lorem';
console.dir(arr[0]);
});
for (var item in arr){
arr[item] = 'Ipsum';
console.dir(arr[0]);
}
与上面显示的代码一样,我注意到更改传递给forEach()
回调的项的值不会导致迭代对象发生更改。
当然使用for...in
。
为什么这样&我该如何改变数组中的值?
我发现MDN
上的主题很容易混淆答案 0 :(得分:10)
使用for ...当然可以。
不,不。您的forEach
循环等同于此for...in
循环(除了顺序):
for (var index in arr) {
var item = arr[index];
console.log(item);
item = 'Lorem';
console.dir(arr[0]);
}
您是否看到数组也未被修改?这是因为JavaScript总是pass-by-value,并且有一个非常简单的规则要记住:
为变量从不赋值会更改另一个变量或数据结构的值。
这意味着,为item
分配新值不能更改arr
的元素。如果你想修改数组,你必须通过为索引赋值来直接改变它,即
arr[index] = 'foo';
答案 1 :(得分:8)
请注意forEach
中的回调有三个参数。第二个是当前元素的索引,第三个是数组本身。如果要修改数组,请使用这两个参数。
答案 2 :(得分:2)
在您的情况下,item
变量按值传递,因为它具有原始值。如果它是一个json对象,并且您将更改其中一个属性,它将反映在原始列表中。
在这种情况下,您可以使用forEach
具有的其他参数。例如:
arr.forEach(element, index, array) {
...
}
使用这些参数,您可以直接影响array[index]