@umberford

Почему такое поведение в цикле forEach?

var arr = ['hello','house','human']
var name = 'John';
arr.forEach(function(item,i,arr){
  item = name;
})
console.log(arr); //['hello','house','human']

код выше выведет ['hello','house','human']
но если вместо item написать arr[i] , то все сработает как надо и выведет ["John", "John", "John"]
var arr = ['hello','house','human']
var name = 'John';
arr.forEach(function(item,i,arr){
  arr[i] = name;
})
console.log(arr); //["John", "John", "John"]

почему так? по сути item == arr[i], но работает не так, как надо
  • Вопрос задан
  • 145 просмотров
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
item - переменная, переданная по значению.
arr - массив, переданный по ссылке.
Ответ написан
Комментировать
item это переменная функции forEach. В каждой итерации этой переменной присваивается значение из массива. Вы перезаписывает его своим (переменную функции). После того как функция отработала ее переменные перестают существовать, массив остаётся неизменным.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
aleksand44
@aleksand44
Все зависит от реализации нативных функций и, как я понимаю, в каждом движке эта реализация может быть своя.
В принципе в документации нигде не сказано что item - это ссылка на конкретный элемент массива, то есть оно вполне быть может быть лишь аргументом-контейнером значения и не более, т.е. перезаписывая его ты перезаписываешь лишь аргумент/локальную переменную, а не элемент массива напрямую.
Ответ написан
Комментировать
@kttotto
пофиг на чем писать
Если напишете так
var arr = [{name:'hello'},{name:'house'},{name:'human'}]
var name = 'John';
arr.forEach(function(item,i,arr){
  item.name = name;
})
console.log(arr);

Тогда
(3) [{…}, {…}, {…}]
{name: "John"},
{name: "John"},
{name: "John"}

В item находится значение элемента а не сам элемент, оберните значение в объект как в примере выше, тогда item будет ссылочным, а так в ней только копия значения, поэтому изменять будете копию, а не сам элемент.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы