8-ой урок: Передаем объект по ссылке

Помогите, пожалуйста, разобраться с передачей объекта по ссылке.

В 8-м уроке такой код:

var diceNumber = 2;

var firstCat = {
  name: 'Кекс',
  points: 0
};

var secondCat = {
  name: 'Рудольф',
  points: 0
};

var cats = [firstCat, secondCat];

var runGame = function (quantity, players) {
  for (var i = 0; i < players.length; i++) {
    var throwResult = keks.throwDice(quantity, quantity * 6);
    players[i].points += throwResult;
    console.log(players[i].name + ' выбросил ' + players[i].points);
  }
  return players;
};

cats = runGame(diceNumber, cats);
console.log(cats);

После объявления объектов мы объявляем переменную «cats», которой присваиваем массив из объявленных ранее объектов:

var cats = [firstCat, secondCat];

После цикла этой переменной «cats» присваиваем иное значение, а именно вызов функции:

cats = runGame(diceNumber, cats);

То есть, получается, как мне представляется, так, что сначала переменная хранила массив из объектов, а затем мы присвоили этой переменной иное значение (вызов функции). Но в значении этой переменной функция, где аргументом выступает переменная тоже самая «cats», которая хранит массив объектов.

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

Если формализовать, то вопрос можно сформулировать так: почему в вызове функции:

cats = runGame(diceNumber, cats);

аргументом «cats» передается массив объектов? Левее же указано, что cats = runGame(diceNumber, cats).

Может быть я как-то совсем не так как нужно это понимаю? Помогите, пожалуйста, разобраться с этим.

Вероятно, дело вот в чем (в теории указано явно):

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

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

2 лайка

cats = runGame(diceNumber, cats);

Из-за приоритета операций сначала выполнится правая часть, которая вернет массив объектов, а только потом операция присваивания =, которая имеет низкий приоритет. Т.е. мы передали массив в функцию, изменили и вернули наружу.
А после этого, само значение массива [{…},{…}], которое мы вернули из функции, уже присвоится переменной cats. Т.о. в переменной cats будет содержаться массив, включающий данные по очкам.
Наверное, да, показали это присвоение просто чтобы было наглядно, что у нас изменился cats. Когда он меняется внутри функции это может быть не так очевидно. Извините, если написала много лишнего и очевидного для вас :slight_smile:

1 лайк

Спасибо!

Спасибо за развернутый ответ!