Как клонировать объект 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 в локальное время