Задать вопрос
@hckn

Почему говорят что forEach меняет начальный массив, если он ничего не меняет?

Вероятно я не правильно понимаю концепцию, но почему говорят что forEach меняет массив, к которому применяется функция, а на практике я изменений не наблюдаю.

Например

let arr = [1,2,3]
arr.forEach(a => {
  a = a+1 
})
console.log(arr)


Консоль выведет первоначальный массив без изменений.
  • Вопрос задан
  • 2809 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 3
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
Не меняется, т.к. а - это значение элемента массива. Но если бы это была ссылка на значение (на объект например), то менялось бы.
arr = [{a: 1}, {a: 2}, {a: 3}]; 
arr.forEach(a => {
  a.a++;
})
console.log(arr) // [{a: 2}, {a: 3}, {a: 4}]

В таком случае да, значения объектов поменяются. Но если вы измените ссылку, то нифига
arr = [{a: 1}, {a: 2}, {a: 3}];
arr.forEach(a => {
  a = { a: a.a+1 };
})
console.log(arr) // Тут все по старому

Также, можно поменять значение массива по ключу.
arr = [1,2,3]
arr.forEach((a, ind) => {
  arr[ind]++;
})
console.log(arr) // [2,3,4]
Ответ написан
Комментировать
rockon404
@rockon404
Frontend Developer
Почему говорят что forEach меняет начальный массив

Кто говорит?

Этот пример, видимо, должен разрушить ваши неокрепшие шаблоны.

Изучайте основы JavaScript. forEach это лишь итерация по элементам массива с применением функции колбека. Остальное происходит по канонам JavaScript.
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
В вашем примере, где массив содержит элементы примтивного типа Number, в функцию передаётся значение. Изменение внутри функции не распространяется на изменение в массиве.

Если бы в функцию передавались объекты, передача была бы «по ссылке» и изменения в эти объекты отразились бы сразу в массиве.

В вашем примере можно задействовать два других параметра: индекс элемента и сам массив и явно поменять элементы массива:
arr = [1,2,3]
arr.forEach((a,i, theArr) => {
  a = a + 1 ;
  theArr[i] = a;
})
console.log(arr) // [2,3,4]

Поробнее про передачу by value / by reference на англ. на SO. Пример оттуда:
function changeStuff(a, b, c)
{
  a = a * 10;
  b.item = "changed";
  c = {item: "changed"};
}

var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};

changeStuff(num, obj1, obj2);

console.log(num);        // 10
console.log(obj1.item);  // changed   
console.log(obj2.item);  // unchanged
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы