Операция присваивания Javascript для копирования ссылок? - PullRequest
5 голосов
/ 09 января 2012

Базовый пример:

var b = 10;
var c = b;
b++;
console.log(b,c);

>> 11 10

c выглядит как копия b.

Но в другом случае:

var x = {};
var y = x;
x.abc = 10;
console.log(x.abc, y.abc);

>> 10 10

Почему y является не копией x, а ссылкой, указывающей на тот же экземпляр, на который указывает x?

Кроме того, я догадался, b++ создает другой экземпляр, поэтому b указывает на новый экземпляр, а c указывает на старый. Однако ...

var u = 10;
setTimeout(function() {
  console.log(u);
}, 10000)
u++;

>> 11

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

Ответы [ 3 ]

10 голосов
/ 09 января 2012

c выглядит как копия b.

Оба являются ссылками на одно и то же неизменное значение.

Почему y это не копия x, а ссылка, которая указывает на экземпляр x указывает на?

x была ссылка на объект в первую очередь, поэтому y этоего копия (копия ссылки, а не копия объекта).

Если u++ создает новый экземпляр,

Это не.

анонимная функция u должна указывать на старую u, не так ли?

u++ назначает ссылку на 11 для u.Анонимная функция смотрит на u, а не на «значение u на момент создания функции».

9 голосов
/ 09 января 2012

Когда назначены примитивы, им присваивается по значению ;Типы ссылок (например, ваш объект) назначаются по ссылке (или, как поправляет меня Джон Скит, им назначается копия ссылки).

Во втором примере x и y оба указывают на один и тот же объект в памяти.Вот почему добавление свойства abc к одному и добавление его к другому

Вы также заметили бы то же поведение, передавая x или y в функцию

function addABC(foo) {
   foo.abc = 10;
}

var x = {};
var y = x;
addABC(x);
console.log(x.abc, y.abc);

Просто обратите внимание, чтохотя x и y указывают на один и тот же объект в памяти, они являются отдельными копиями ссылки, поэтому этот

    var x = { a: 1 };
    var y = x;
    y = {};
    alert(x.a);

и этот

    var x = { a: 1 };
    var y = x;
    x = {};
    alert(y.a);

все равно будут предупреждать 1.

4 голосов
/ 09 января 2012

Это утверждение:

var y = x;

копирует значение x в качестве начального значения y. Однако задействованные значения ссылаются на объект, а не на сам объект. Обратите внимание, что это не то же самое, что сказать, что присвоение копирует «ссылку на x» - это действительно значение из x. Так, в частности, если вы измените значение x для ссылки на другой объект, например

x = "something else";

тогда это не изменит значение y - его значение все равно будет ссылкой на исходный объект.

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