• Теория
  • Теория

Передаём объект по ссылке

Перед тем, как мы продолжим писать игру в кости, рассмотрим одну важную особенность объектов на практике.

let firstCat = {
  name: 'Кекс',
  age: 5
};

let secondCat = firstCat;
console.log(secondCat); // Выведет: {name:"Кекс", age:5}

firstCat.name = 'Снежок';
console.log(secondCat); // Выведет: {name:"Снежок", age:5}

Мы же не трогали второй объект secondCat, но он изменился вместе с первым объектом firstCat. Почему так? Это вообще законно?

В JavaScript вполне. Объект здесь всегда один, в памяти не создаётся новое место под копию объекта. Каждая переменная содержит не новую отдельную сущность, а ссылку на один-единственный объект. Поэтому когда мы меняем что-то в объекте через одну из переменных, в которой содержится ссылка на него, изменения видны во всех других переменных, будь их хоть двадцать или сорок. Это важная особенность объектов, которую надо запомнить. Она так и называется — передача объектов по ссылке.

В нашей программе происходит то же самое. Мы создаём массив cats с объектами игроков и передаём его в функцию runGame. Внутри функции мы используем этот массив под другим именем, players, и меняем хранящиеся в нём объекты. Если после окончания работы функции вывести cats в консоль, то окажется, что его содержимое поменялось, хотя мы ничего не возвращали из функции и вроде бы работали с совсем другим массивом.

Несмотря на то, что такое поведение объектов — известный факт, работа программы может стать неочевидной, если мы захотим передать изменённый массив ещё куда-то, ведь мы меняем массив неявно по ходу работы цикла. Код нужно писать максимально просто и понятно для себя и других разработчиков. Поэтому мы будем возвращать изменённый массив players из функции и записывать его в массив cats, явно обновляя его.

Минимальный вид табов
  • index.html
HTML
HTML

Вы перешли на другую страницу

Кликните внутри мини-браузера, чтобы поставить фокус в это окно.

100%
Бабушка Кекс

Притормози, дружище

Проходить вызовы части «Объекты» тренажёра «Базовые структуры данных» можно после регистрации и оформления подписки.