StructuredClone() — нативное глубокое копирование в JS

Многие знают, что поверхностное копирование (const copy = obj) копирует только ссылку на объект, но не создаёт полноценную копию. Если изменить copy, изменится и исходный объект.

Для глубокого копирования раньше использовали JSON.parse(JSON.stringify()). Но у этого способа куча проблем: он не копирует Date, Map, Set, RegExp, undefined, падает на циклических ссылках и просто молча проглатывает функции.

Хотелось напомни , а некоторым и рассказать что существует другой более удобный и полезный способ ,глубокого копирования объекта.
structuredClone()-встроенный метод для глубокого копирования, который работает на уровне движка.

const original = {
name: "Мощный WEB",
date: new Date(),
map: new Map([['key', 'value']]),
set: new Set([1, 2, 3]),

arr: [1, 2, 3],
nested: { a: 1, b: 2 } };
const clone = structuredClone(original); // Теперь clone — это полноценная копия console.log(clone !== original); // true
console.log(clone.date instanceof Date); // true
console.log(clone.map instanceof Map); // true

Всё работает "из коробки": Map, Set, Date, ArrayBuffer, TypedArray, циклические ссылки.

Почему это лучше JSON.parse(JSON.stringify())

В отличие от устаревшего JSON-подхода, structuredClone() корректно обрабатывает циклические ссылки - там, где JSON.stringify() выбрасывает ошибку, новый метод спокойно создаёт копию. Он сохраняет типы данных: Date остаётся датой, а не превращается в строку, Map и Set остаются коллекциями, а не пустыми объектами. Значение undefined не пропадает, а копируется как есть, а RegExp сохраняет своё состояние, а не превращается в пустой объект. Единственное ограничение — функции не копируются: в JSON.parse(JSON.stringify()) они просто исчезают, а structuredClone() в таких случаях выбрасывает ошибку DataCloneError.

Все современные браузеры ,поддерживают данный метод.

Используйте ,его даже во времена AI и "Вайбкодинга", знать такие вещи необходимо.

Если интересны технологии веб-разработки ,подписывайте на мои каналы в Telegram и MAX.

Лига программистов

2.3K поста12K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

0
Автор поста оценил этот комментарий

В этом вашем JS же вроде есть OOP? Почему бы не создать класс, знающий, как его экземплярам себя копировать?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Этот наш js ,плохо ооп реализовал

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества