Объекты [8/30] Передает объект по ссылке

Добрый день, объясните пожалуйста, согласно теории: мы передаем объект по ссылке. В теории к данному уроку, мы создаем два объекта одному присваиваем определенное значение, другому значение первого (var firstCat = {name: ‘Кекс’, age: 5}; и var secondCat = firstCat); Меняем первый объект и меняется второй и это понятно (Объект здесь всегда один, в памяти не создаётся новое место под копию объекта. Каждая переменная содержит не новую отдельную сущность, а ссылку на один-единственный объект). Но в данном примере мы меняем ссылку на объект, которую мы отправляем в функцию, а не сам объект (если верить теории объект всегда один) и без ЯВНОГО возврата, в чем мы убедились, она меняет наш объект ?

  1. Почему в примере один порядок действий, а в нашей задаче обратный и почему он работает, и если он работает почему об этом не сказать?

  2. Как может измениться объект, который всегда один, если мы его отправили в функцию?

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

1 лайк

Объект всегда один. Любая операция, которая производится с переменной, в которую изначально был записан объект или любой другой переменной, в которую он был присвоен, перезаписывает сам объект.

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

Саша, прочитала вопрос выше + Ваш ответ, и мне тогда непонятно, зачем в задании 8/30 мы возвращаем обновленный массив return players; и записываем в переменную cats результат работы функции cats = runGame(diceNumber, cats);, если при этом ничего не меняется в выводе в консоль?! Мне вообще этот момент непонятен.