Does forEach() bind by reference?

foreach, javascript, pass-by-reference

Solution

Using for...in certainly does.

No it doesn't. Your `forEach` loop is equivalent to this `for...in` loop (apart from the order):

for (var index in arr) {
  var item = arr[index];
  console.log(item);
  item = 'Lorem';
  console.dir(arr[0]);
}

Do you see that the array isn't modified either? That's because JavaScript is always pass-by-value, and there is a very simple rule to keep in mind:

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

That means, assigning a new value to `item`, cannot change an element of `arr`. If you want to to modify the array, you have to mutate it directly by assigning a value to an index, i.e.

arr[index] = 'foo';

Problem

``` 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]); } ``` Like the code above shows, I noticed that changing the value of an item passed to the callback of `forEach()` does not cause the iterated object to alter. Using `for...in` certainly does. Why is that & how should I alter values in an array? I find that the topic is covered quite confusing on MDN

Original source