Установка одного объекта равным другому объекту с помощью оператора присваивания в Javascript

Я перехожу к javascript из фона C. В javascript, когда я использую оператор присваивания для присвоения одного объекта другому, копирует ли он значения из одного в другой или они оба теперь указывают на одни и те же данные? Или оператор присваивания что-то делает в этом случае?

function point_type()
 {
 this.x = 0;
 this.y = 0;
 }

var pnt1 = new point_type();
var pnt2 = new point_type();

pnt1.x = 4;
pnt1.y = 5;

pnt2 = pnt1;

pnt1.x = 8;
pnt2.y = 9;

В приведенном выше примере pnt2.x теперь равен 8, по-прежнему равен 4 или по-прежнему равен 0?

Да, я понимаю, что могу проверить это сам, и я буду делать это, пока жду ответа от сообщества. Тем не менее, я надеюсь, что ответ на мой вопрос будет на один шаг дальше, чем просто ответ на этот один пример, и может пролить некоторый свет на то, как работают объекты javascript, и на некоторые передовые методы.

Дополнительный вопрос:
Похоже, ответ заключается в том, что ссылка скопирована. pnt2 и pnt1 теперь указывают на одни и те же данные. Можно ли настроить мой объект так, чтобы значения копировались? Как это обычно делается в javascript? Ясно, что я не хочу устанавливать каждый атрибут отдельно каждый раз, когда мне нужно скопировать этот объект.


person Chad DeShon    schedule 22.12.2009    source источник


Ответы (4)


В JavaScript примитивные типы копируются по значению, а ссылочные типы копируются по ссылке. Подробнее здесь: http://docstore.mik.ua/orelly/web/jscript/ch09_03.html

person Annie    schedule 22.12.2009
comment
Отличное чтение о глубоком копировании, мелком копировании и клонировании в Javascript oranlooney.com/functional-javascript - person micahwittman; 22.12.2009

Всякий раз, когда мне нужно скопировать один объект в другой в JS, я просто привожу его к примитиву:

var newObject = JSON.stringify(oldObject);

Затем, когда мне нужно его использовать:

var evenNewerObj = JSON.parse(newObject);

Надеюсь, это поможет кому-то.

person Matt Cashatt    schedule 25.04.2013

Он равен 8.

pnt2 = pnt1

Этот оператор указывает объект pnt2 на объект pnt1, поэтому любые изменения, которые вы делаете с pnt1, будут отображаться в pnt2.

person Lark    schedule 22.12.2009

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

person Gabriel McAdams    schedule 22.12.2009