Как клонировать объект Date?
При присваивании переменной типа Date
другой переменной происходит копирование ссылки на один и тот же экземпляр. Это означает, что изменение одного экземпляра изменит и другой.
Как я могу на самом деле клонировать или скопировать экземпляр Date
?
5 ответ(ов)
Самый чистый подход для копирования объекта Date
в JavaScript выглядит следующим образом:
let date = new Date();
let copyOfDate = new Date(date.valueOf());
console.log(date);
console.log(copyOfDate);
В этом примере мы создаем новый объект Date
, используя метод valueOf()
, который возвращает числовое представление даты в миллисекундах. Это позволяет создать точную копию исходного объекта date
, не затрагивая его. Использование valueOf()
гарантирует, что у нас будет новая дата, независимая от оригинала.
Обновление на 2021 год:
С одной стороны, понятие клонирования объекта Date
выглядит более грандиозным, чем оно есть на самом деле. Судя по всему, у него есть только один элемент данных экземпляра, а именно — хранимое время. По сути, мы просто создаём новый объект с тем же временем.
Что бы ни было в прошлом, конструктор new Date()
определённо принимает объект Date
в качестве единственного аргумента:
const date = new Date(); // С аргументом или без.
const date2 = new Date(date); // Клонируем исходную дату.
В спецификации по адресу https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date на шаге 4(b) указано, что объект Date
абсолютно допустим, и это эквивалентно new Date(date.valueOf())
, как было указано в некоторых ответах выше. Как я уже сказал, всё, что вы делаете, это создание нового объекта Date
с таким же временем, как у другого.
Также стоит отметить, что документация по адресу https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date была обновлена, чтобы включить эту информацию.
Ваш код создает объект даты orig
, а затем создает другой объект даты copy
, который является копией orig
. Давайте разберем его подробнее:
var orig = new Date(); // Создаем новый объект Date, представляющий текущее время
var copy = new Date(+orig); // Копируем orig, передавая его значение в конструктор нового объекта Date
console.log(orig, copy); // Выводим оба объекта в консоль
Основная идея тут заключается в том, что при использовании +orig
мы получаем числовое представление времени в миллисекундах с начала эпохи UNIX (1 января 1970 года), что делает copy
независимым объектом, но с той же временной меткой, что и orig
.
Таким образом, в консоли вы увидите, что оба объекта orig
и copy
представляют одно и то же время, однако они являются независимыми экземплярами, и изменения в одном из них не повлияют на другой.
Вы можете создать метод clone
для объекта Date
, чтобы удобно копировать дату. Вот упрощённый вариант его реализации:
Date.prototype.clone = function () {
return new Date(this.getTime());
}
Этот метод возвращает новый объект Date
, который является копией текущего объекта даты. Мы используем метод getTime()
, чтобы получить временную метку в миллисекундах, а затем создаём новый экземпляр Date
с этой временной меткой. Таким образом, ваш оригинальный объект и его копия будут независимыми.
Ваше решение создания копии объекта Date
с использованием конструктора Date
вполне корректно. Принятый вами метод:
dateOriginal = new Date();
cloneDate = new Date(dateOriginal);
действительно создает новый объект Date
, который является клоном dateOriginal
. Этот способ безопасен и работает в большинстве современных браузеров, включая IE7 и Chrome 19, как вы уже отметили.
Тем не менее, стоит учесть несколько вещей:
Совместимость: Как вы уже протестировали в IE7 и Chrome 19, метод работает в большинстве браузеров, но если вам нужно поддерживать устаревшие средние браузеры, рекомендуется дополнительно проверить это в других версиях.
Производительность: Если вам нужно клонировать дату много раз в производительных приложениях, стоит внимательно отслеживать производительность. Обычно клонирование объектов
Date
через конструктор не вызывает проблем, но в больших количествах это может сказаться на производительности.Сохранение временной зоны: При копировании
Date
через конструктор сохраняется вся информация о дате и времени, включая временную зону.
Таким образом, ваш метод безопасен и удобен для клонирования объектов Date
.
Сравнение двух дат в JavaScript
Как отсортировать массив объектов по свойству даты?
Как добавить часы к объекту Date?
Увеличение даты в JavaScript
Преобразование даты и времени UTC в локальное время