Передача по ссылке против Копия ссылки - PullRequest
1 голос
/ 31 марта 2020

Я понял понятие pass by reference. Однако концепция copy of reference меня немного смущает.

Есть ли разница между этими двумя проходами по ссылке против копией ссылки ?

var user={
   name:"xxx"
}

function update(ref) {
  ref = {
     dep:"yyy"
  };
}

update(user);

При использовании приведенного выше кода, почему он не повторно инициализирует объект user?

Когда я обновляю существующее свойство следующим образом:

ref.name='modified'

Обновляет объект user.

Также, если я могу спросить, передается ли рефакторированный код копия ссылки ?

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Это не имеет никакого отношения к передаче переменной по ссылке или нет.

На самом деле проблема в том, что вы поместили другой объект внутрь ref, который не указывает на тот же объект хранится в переменной user.

function update(ref) {

  //In this line we are reinitializing the value of ref with another object
  ref = {
    dep: "yyy"
  };
  ref.name = 'modified';
}

Демонстрация:

Давайте посмотрим на разницу в этом фрагменте:

var user = {
  name: "xxx"
}

function update(ref) {
  //Here we are updating ref/user 
  ref.before = "a value";
  
  //And in this line we are reinitializing the value of ref with another object
  ref = {
    dep: "yyy"
  };
  ref.name = 'modified';
  console.log('This is ref value: ');
  console.log(ref);
}
update(user);
console.log('This is user value: ');
console.log(user);

Аргументы в JS функциях:

А что касается того, как аргументы передаются в функции (по ссылке или по значение) есть разница между примитивами и объектами, вы можете прочитать документы MDN Функции , где написано:

Параметры примитива (например, число) передаются в функции по значению ; значение передается функции, но если функция изменяет значение параметра, это изменение не отражается глобально или в вызывающей функции.

Если вы передаете объект (т.е. непримитивное значение, такое как Array или определенный пользователем объект) в качестве параметра , и функция изменяет свойства объекта, это изменение видно вне функции .

0 голосов
/ 31 марта 2020

Если переменная ref является ссылкой на некоторый объект obj, то значение в ref является адресом памяти obj. Создание копии ref, назовем ее ref2, просто создаст другую переменную с тем же адресом памяти, хранящимся в ней. Поэтому передача ссылки или копии ссылки - это одно и то же.

То, что не будет таким же, будет проходить мимо значения и проходить мимо ссылки . Разница между этими двумя хорошо документирована онлайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...