Установка одного объекта равным другому объекту с помощью оператора присваивания в Javascript - PullRequest
12 голосов
/ 22 декабря 2009

Я подхожу к JavaScript из фона Си. В 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? Ясно, что я не хочу устанавливать каждый атрибут отдельно каждый раз, когда мне нужно скопировать этот объект.

Ответы [ 4 ]

15 голосов
/ 25 апреля 2013

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

var newObject = JSON.stringify(oldObject);

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

var evenNewerObj = JSON.parse(newObject);

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

13 голосов
/ 22 декабря 2009

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

2 голосов
/ 22 декабря 2009

равно 8.

pnt2 = pnt1

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

1 голос
/ 22 декабря 2009

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

...