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

标签 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 上很困惑。

最佳答案

Using for...in certainly does.

不,它没有。您的 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 , 并且有一个非常简单的规则要记住:

Assigning a value to a variable never changes the value of another variable or data structure.

也就是说,给item赋新值,不能改变arr的元素。如果你想修改数组,你必须通过为索引赋值直接改变它,即

arr[index] = 'foo';

关于javascript - forEach() 是否通过引用绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23964111/

相关文章:

arrays - Swift:通过引用传递数组?

javascript - 如何将 HTML5 Canvas 模型与 MVVM/MVP 数据框架链接起来

javascript - 检查第二个字符串是否是另一个字符串的旋转

javascript - 如何在 Javascript 中找出给定属性在对象中的哪个位置

javascript - ArcGIS Javascript - 缩放以显示所有点

php - 如何在 foreach 中使用多维数组?

c++ - 将非指针变量作为对指针的引用传递给函数

c++ - 赋值中引用的含义

javascript - jQuery:每个循环暂停直到完成

java - 同时拥有 Iterator.forEachRemaining() 和 Iterable.forEach() 有什么意义?