Почему объект foo не меняется?

#javascript #closures

#javascript #замыкания

Вопрос:

 var foo = {'bar': 1};

function overwriteFoo(obj) {
   obj = foo;
   obj = {'bar': 2};
}

overwriteFoo(foo)
console.log(foo)
 

Я думал, что присвоение foo объекту obj заставит это работать так, как я хотел. Я думал, что объекты в javascript были отправлены по ссылке, так почему я не могу переназначить foo?

Ответ №1:

Как говорят некоторые люди, все передается по значению, а значения объектов являются их ссылками. Когда вы это делаете obj = {'bar': 2} , вы переназначаете obj , чтобы указывать на {'bar': 2} , а не указывать на foo . На самом деле, нет способа просто поменять весь объект таким образом. Однако вы можете изменять свойства, поскольку они по существу «разыменовывают» значение:

 function overwriteFoo(obj) {
    obj.bar = 2;
}
overwriteFoo(foo);
console.log(foo); // will now be {bar: 2}
 

Ответ №2:

Привязка переменной к другой переменной просто возвращает содержимое присвоенной переменной.

Пример:

 var obj1 = {hello: 'hello'};
var obj2 = obj1;

alert(obj2);// will return hello: 'hello'

// BUt if you try to change obj2 to an object then obj1 will be just unassigned from obj2 but is not changed.