Передача объекта и изменение объекта против изменения его свойств в JavaScript - PullRequest
0 голосов
/ 23 июня 2019

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

Но когда я изменяю свойства объекта, переданного в функцию, объект обновляется?

// Case 1
var objectX = {name: 'stackoverflow'};

function changeProperty(objectX) {
   objectX.name = 'google';
}

changeProperty(objectX);
console.log(objectX); // {name: 'google'};

// Case 2
var objectY = {name: 'stackoverflow'};

function changeEntireObj(objectY) {
   objectY = {};
}

changeEntireObj(objectY);
console.log(objectY); // {name: 'stackoverflow'} instead of {}

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

передается по значению, где значением является адрес памяти объекта

Именно так и происходит.

При вводе вашего changeEntireObj(obj) первый аргумент содержитадрес объекта в куче JS.

И когда вы делаете

objectY = {};

, вы просто назначаете новое значение (адрес нового объекта) для objectY.

Эти изменения являются локальными для функции.Поскольку параметры передаются по значению, новое значение objectY не будет распространяться за пределы функции.

0 голосов
/ 23 июня 2019

Представьте себе имена переменных (для объектов) как содержащие адреса памяти для этих объектов.В случае 1 objectX.name = 'google'; ищет объект в памяти, на который ссылается objectX, и изменяет одно из его свойств.В случае 2, когда вы делаете objectY = {};, переменная, называемая objectY внутри этой функции, будет ссылаться на вновь созданный пустой объект - но исходный объект, определенный вне функции, никогда не был переназначен, поэтому он по-прежнему указывает нарасположение в оригинальном объекте.

Если вы хотите, чтобы внешний objectY указывал на новый объект, вам пришлось бы явно вернуть новый объект из функции и переназначить внешнюю переменную:

var objectY = {name: 'stackoverflow'};

function changeEntireObj(objectY) {
   objectY = {};
   return objectY;
}

objectY = changeEntireObj(objectY);
console.log(objectY);
...