7

Как клонировать объект Date?

27

При присваивании переменной типа Date другой переменной происходит копирование ссылки на один и тот же экземпляр. Это означает, что изменение одного экземпляра изменит и другой.

Как я могу на самом деле клонировать или скопировать экземпляр Date?

5 ответ(ов)

1

Самый чистый подход для копирования объекта Date в JavaScript выглядит следующим образом:

let date = new Date(); 
let copyOfDate = new Date(date.valueOf());

console.log(date);
console.log(copyOfDate);

В этом примере мы создаем новый объект Date, используя метод valueOf(), который возвращает числовое представление даты в миллисекундах. Это позволяет создать точную копию исходного объекта date, не затрагивая его. Использование valueOf() гарантирует, что у нас будет новая дата, независимая от оригинала.

0

Обновление на 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 была обновлена, чтобы включить эту информацию.

0

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

0

Вы можете создать метод clone для объекта Date, чтобы удобно копировать дату. Вот упрощённый вариант его реализации:

Date.prototype.clone = function () {
    return new Date(this.getTime());
}

Этот метод возвращает новый объект Date, который является копией текущего объекта даты. Мы используем метод getTime(), чтобы получить временную метку в миллисекундах, а затем создаём новый экземпляр Date с этой временной меткой. Таким образом, ваш оригинальный объект и его копия будут независимыми.

0

Ваше решение создания копии объекта Date с использованием конструктора Date вполне корректно. Принятый вами метод:

dateOriginal = new Date();
cloneDate = new Date(dateOriginal);

действительно создает новый объект Date, который является клоном dateOriginal. Этот способ безопасен и работает в большинстве современных браузеров, включая IE7 и Chrome 19, как вы уже отметили.

Тем не менее, стоит учесть несколько вещей:

  1. Совместимость: Как вы уже протестировали в IE7 и Chrome 19, метод работает в большинстве браузеров, но если вам нужно поддерживать устаревшие средние браузеры, рекомендуется дополнительно проверить это в других версиях.

  2. Производительность: Если вам нужно клонировать дату много раз в производительных приложениях, стоит внимательно отслеживать производительность. Обычно клонирование объектов Date через конструктор не вызывает проблем, но в больших количествах это может сказаться на производительности.

  3. Сохранение временной зоны: При копировании Date через конструктор сохраняется вся информация о дате и времени, включая временную зону.

Таким образом, ваш метод безопасен и удобен для клонирования объектов Date.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь