- Теория
- Теория
Передаём объект по ссылке
Перед тем, как мы продолжим писать игру в кости, рассмотрим одну важную особенность объектов на практике.
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
Вы перешли на другую страницу
Кликните внутри мини-браузера, чтобы поставить фокус в это окно.