forEach()是否通过引用绑定?

时间:2014-05-30 22:13:53

标签: javascript foreach pass-by-reference

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

上的主题很容易混淆

3 个答案:

答案 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]