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
Foreach is guaranteed to be sequential for sequential collections (that is, the normal hierarchy, or for anything transformed by .
The forEach() method calls a specified callback function once for every element it iterates over inside an array. Just like other array iterators such as map and filter , the callback function can take in three parameters: The current element: This is the item in the array which is currently being iterated over.
Note: forEach expects a synchronous function. forEach does not wait for promises. Make sure you are aware of the implications while using promises (or async functions) as forEach callback.
The forEach() method calls a function for each element in an array. The forEach() method is not executed for empty elements.
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';
In your case, the item
variable is passed by value, because it is of a primitive value. If it were a json object, and you would change one of its properties, it would be reflected on the original list.
In this situation, you can use other arguments that the forEach
has. For example:
arr.forEach(element, index, array) {
...
}
Using these arguments, you can affect directly array[index]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With