@plxel

Почему не происходит изменения массива при передаче в функцию?

Разбираюсь с основами JS. Пытаюсь понять, почему при передаче массива в функцию мы можем спокойно изменить элемент, обратившись к нему по индексу, но не можем заменить массив другим массивом. Например:
function changeElement(array){
	array[0] = 999;
}
function ChangeFullArray(array){
  	array = [];
}
var array = [1,2,3];
console.log('At the begining..', array);
changeElement(array);
console.log('After changeElement..', array);
ChangeFullArray(array);
console.log('After ChangeFullArray..', array);

Получаем следующий вывод:
At the begining.. [1, 2, 3]
After changeElement.. [999, 2, 3]
After ChangeFullArray.. [999, 2, 3]


Сам никак не смог понять почему так происходит. Объясните, пожалуйста.
  • Вопрос задан
  • 2265 просмотров
Решения вопроса 1
@an23
Потому что в функцию передается не сам массив, а ссылка на массив. Таким образом у тебя есть 2 разных переменных ссылающихся на одну и ту же область памяти. Когда ты изменяешь определенный элемент, то в этой области памяти он меняется и соответственно ты получаешь 999, 2, 3, а вот когда ты присваиваешь своей 2й переменно [] ты просто затираешь ссылку в этой переменной, т.е. теперь локальная и глобальная переменные ссылаются на различную область памяти
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Если я не ошибаюсь, данный механизм называется "copy on write".

Т.е. если передаваемый по ссылке объект пытаются заменить, создается копия этого объекта и операции производятся над копией, а не оригиналом.(ChangeFullArray)
Ответ написан
Комментировать
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
array.length = 0;
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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