Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Создание копии объекта даты (https://javascript.ru/forum/misc/75340-sozdanie-kopii-obekta-daty.html)

AlexanderFilatov 25.09.2018 13:54

Создание копии объекта даты
 
Всем доброго дня!Ниже приведенная функция возвращает число, которое было days дней назад от date, при этом исходный объект не должен меняться.Так вот функция работает, но мне не понятно, почему при создании копии объекта происходит копирование по значению, а не по ссылке?Ведь по сути в скобках мы указываем ссылку на объект: var dateCopy = new Date(date);
var date = new Date();
alert(getDateAgo(date, 1));
function getDateAgo(date, days) {
   var dateCopy = new Date(date);
   dateCopy.setDate(date.getDate() - days);
   return dateCopy.getDate();
}
alert(date);// исходный объект не изменился!

Объясните пожалуйста в чем я не прав!Спасибо!

SuperZen 25.09.2018 14:22

https://developer.mozilla.org/ru/doc...l_Objects/Date

Создаёт экземпляр объекта Date, представляющего собой момент времени.

потом ты говоришь:

Ведь по сути в скобках мы указываем ссылку на объект: var dateCopy = new Date(date);

так новый объект
var dateCopy = new Date(date);

так ссылка
var dateLink = date

AlexanderFilatov 26.09.2018 06:48

Получается при создании копии объекта происходит копирование по значению переменной date!?

j0hnik 26.09.2018 07:15

AlexanderFilatov,
конструктор каждый раз создает создает новый экземпляр, поэтому
var dateCopy = new Date(date);
dateCopy !== date //true

если нужна ссылка то так
var dateCopy = date;

AlexanderFilatov 26.09.2018 11:52

j0hnik, спасибо я понял!

AlexanderFilatov 26.09.2018 13:05

Цитата:

Сообщение от j0hnik
var dateCopy = new Date(date);
dateCopy !== date //true

Получается здесь сравниваются две ссылки на объект, а так как они имеют разные адреса в памяти, то они не идентичны!Я правильно понял, что при сравнении объектов, сравниваются их ссылки!?То есть они будут равны только тогда, когда имеют один и тот же адрес!

Белый шум 26.09.2018 13:10

AlexanderFilatov,
да

AlexanderFilatov 27.09.2018 09:10

Цитата:

Сообщение от j0hnik
конструктор каждый раз создает создает новый экземпляр

Я так понимаю это не относится к "обычному" объекту, создаваемому через конструктор new Object, так как здесь объекты равны:
var car = {
    model: "focus"
};
var carCopy = new Object(car);
alert(car == carCopy); // true

j0hnik 27.09.2018 09:54

Конструктор Object создаёт объект-обёртку для переданного значения. Если значение уже является объектом, конструктор вернёт это значение.
в общем так делать не нужно, это бесполезное действие.

Dilettante_Pro 27.09.2018 11:13

Да уж, это никак не копия - это один и тот же объект
var car = {
    model: "focus"
};
var carCopy = new Object(car);
alert(carCopy.model); 
carCopy.model = "lexus";
alert(car.model);


Часовой пояс GMT +3, время: 06:54.