13 декабря 2022 2917
Долгое время для создания глубоких копий значений в JavaScript разработчикам приходилось использовать обходные решения и библиотеки. Сейчас в JavaScript появилась встроенная функция structuredClone() для глубокого копирования, которая в разы облегчила жизнь джавистов. Этот API был реализован во всех браузерах, например, в Firefox версии Firefox 94. Еще одно преимущество API — он работает в Node 17 и Deno 1.14. Сегодня мы расскажем, как прямо сейчас начать использовать эту функцию, не испытывая никаких неудобств.
Глубокое копирование в JavaScript с использованием структурных клонов

Поверхностное копирование

Копирование значения в JavaScript почти всегда поверхностное, а не глубокое. Другими словами, изменения глубоко вложенных значений будут видимы как в копии, так и в оригинале.

Одним из способов создания поверхностной копии в JavaScript является использование оператора расширения объекта...:

const myOriginal = {
someProp: "with a string value",
anotherProp: {
    withAnotherProp: 1,
    andAnotherProp: true
}
};
const myShallowCopy = {...myOriginal};

Добавление или изменение свойства непосредственно в поверхностной копии повлияет только на копию, но не на оригинал:


myShallowCopy.aNewProp = "a new value";
console.log(myOriginal.aNewProp)
// ^ logs `undefined`

Однако добавление или изменение глубоко встроенных свойств влияет как на копию, так и на оригинал:


myShallowCopy.anotherProp.aNewProp = "a new value";
console.log(myOriginal.anotherProp.aNewProp)
// ^ logs `a new value`

Выражение {...myOriginal} проводит итерацию по (перечислимым) свойствам myOriginal с помощью оператора Spread. При этом используется имя и значение свойства, которое присваивается одно за другим заново создаваемому, пустому объекту. В результате мы получаем объект, который будет идентичен по форме, но со своей собственной копией списка свойств и значений. Значения также копируются, но так называемые примитивные значения обрабатываются JavaScript не так, как непримитивные значения. Процитируем MDN:

В JavaScript примитив (примитивное значение, примитивный тип данных) — это данные, которые не являются объектом и не имеют методов. Существует семь примитивных типов данных: string, number, bigint, boolean, undefined, symbol и null.

MDN — Примитив

Непримитивные значения обрабатываются как ссылки, т.е. копирование значения на самом деле это просто копирование ссылки на один и тот же базовый объект, что и приводит к поверхностному копированию.

11235921_11104.jpg

Глубокое копирование

Противоположность поверхностного копирования — глубокое копирование. Алгоритм его работы предполагает копирование свойств объекта одного за другим, но действует он рекурсивно, когда обнаруживает ссылку на другой объект, создавая также и копию этого объекта. Это чрезвычайно важно для того, чтобы два куска кода случайно не обращались к одному и тому же объекту и не управляли состоянием друг друга.

Раньше в JavaScript не было простого и удобного способа создания глубоких копий значения. Многие программисты полагались на сторонние библиотеки, например использовали функцию cloneDeep() библиотеки Lodash. Пожалуй, самым популярным решением этой проблемы было использование хака на основе JSON:

const myDeepCopy = JSON.parse(JSON.stringify(myOriginal));

Это обходное решение было настолько популярным, что в
движке JavaScript V8 был оптимизирован метод JSON.parse() и в особенности указанный выше паттерн,
чтобы сделать его работу максимально быстрой. Он действительно работает быстро,
но имеет ряд недостатков и подводных камней:
  • Рекурсивные структуры данных. Метод JSON.stringify() работает, когда ему задана рекурсивная структура данных. Это часто происходит при работе со связанными списками или деревьями.
  • Встроенные типы. Метод JSON.stringify() работает, если значение содержит другие встроенные объекты JS, такие как MapSetDateRegExp или ArrayBuffer.
Функции. Метод JSON.stringify() отклоняет функции.

Структурное клонирование

Платформа уже давно нуждалась в возможности создавать глубокие копии значений JavaScript в ряде случаев: для хранения значения JS в IndexedDB требуется определенная сериализация, чтобы значение могло храниться на диске, потом десериализовано для восстановления значения JS. Точно так же для отправки сообщений в WebWorker с помощью postMessage() требуется перенести значение JS из одной области JS в другую. Используемый для этого алгоритм называется «структурный клон», и до недавнего времени он был практически недоступен для разработчиков.

Сейчас ситуация изменилась. Спецификация HTML была изменена так, чтобы выдавать функцию structuredClone(), которая выполняет именно этот алгоритм, нужный разработчикам для простого создания глубоких копий значений JavaScript.

Только и всего! Это весь API. Если вы хотите узнать подробности, посмотрите статью MDN.

Возможности и ограничения

Структурное клонирование устраняет многие (хотя и не все) недостатки метода JSON.stringify(). Структурное клонирование может обрабатывать циклические структуры данных, поддерживает многие встроенные типы данных и в целом работает более надежно и, как правило, быстрее.

Однако у него есть некоторые ограничения, которые могут стать для вас неожиданностью:

  • Прототипы. Если вы используете structuredClone() с экземпляром класса, то в качестве возвращаемого объекта вы получает основной объект, так как структурное клонирование отменяет цепочку прототипов объекта.

  • Функции. Если ваш объект содержит функции, они будут тихо удалены.

  • Неклонируемые значения. Для некоторых значений невозможно применить структурное клонирование, прежде всего для Error и узлам DOM. Попытка приведет к тому, что structuredClone() выдаст ошибку.

Если какие-либо из этих ограничений вам мешают, библиотеки, вроде Lodash, по-прежнему обеспечивают кастомную реализацию других алгоритмов глубокого копирования, которые могут подойти для вашего случая.

Производительность

Я не проводил нового сравнения показателей, но сравнивал разные методы в начале 2018 еще до появления structuredClone(). Тогда метод JSON.parse() был самым быстрым вариантом для очень маленьких объектов. Полагаю, что и сейчас это так. Методы, основанные на структурном клонировании, были (существенно) быстрее для более крупных объектов. Учитывая, что новый метод structuredClone() не нарушает работу других APIs и надежнее, чем JSON.parse(), я бы рекомендовал сделать его стандартным методом для глубокого копирования.

Заключение

Если вам нужно создать глубокую копию значения JS (например, потому что вы используете неизменяемые структуры данных или хотите, чтобы функция работала с объектом, не затрагивая оригинал), то вам больше не нужно искать обходные решения или библиотеки. Теперь в экосистеме JS есть structuredClone(). Ура!

Погрузитесь в изучение Java и освойте новые технологии на продвинутом уровне со скидкой 10%: https://ibs-training.ru/training/katalog_kursov/razrabotka_po_java/

Источник: https://web.dev/structured-clone/



Последние статьи в блоге

Искусственный архитектор: как нейросети справляются с проектированием ПО

В этой статье расскажем про большие языковые модели в приложении к работе архитектора ПО. Вместе мы посмотрим, насколько хорошо GPT понимает ИТ-архитектуру и сможет ли уже сегодня заменить архитектора. Пора разобраться, насколько глубоко ИИ может встроиться в рабочие процессы архитектора ПО — и стоит ли ему там оставаться.

Новости
24 апреля 2026

Бабушка с долгом в полмиллиона, однопоточное ядро и другие грабли: как не повторить чужие архитектурные ошибки

Любая система рано или поздно проверяется на прочность: нагрузкой, ростом бизнеса или человеческим фактором. Именно в эти моменты всплывают решения, которые казались безобидными на старте. Ниже — реальные кейсы из практики, где небольшие архитектурные допущения со временем превращались в ощутимые проблемы. Разберем, какие сигналы можно было заметить сразу и что стоит учитывать, чтобы не повторить эти сценарии в своих проектах.

Новости
16 апреля 2026

Как защитить информацию в приложениях, использующих ИИ

Представим, что системы контроля и анализа транзакций в банке начинают игнорировать 30% мошеннических операций. Система управления энергосетью выводит из строя ключевой узел подачи электроэнергии в город. Чат-бот службы поддержки начинает массово раскрывать персональные данные клиентов. К сожалению, это новая реальность, с которой может столкнуться любая компания, интегрирующая ИИ-системы в бизнеспроцессы.

Новости
08 апреля 2026

Java без розовых очков: какие знания отделяют грейды

Почти каждый разработчик рано или поздно задается вопросом: «Я уже Middle или все еще уверенный Junior?» Опыт растет, задач становится больше, стек шире — но вместе с этим появляется и иллюзия, что раз ты пишешь на Java каждый день, значит, язык знаешь.

Новости
23 марта 2026

ИИ против джуна: как победить нейросети при устройстве на работу

Начинающим разработчикам и раньше было непросто найти первую работу, а сейчас и подавно: конкуренция выросла кратно, а рынок окончательно стал «рынком работодателя».

11 марта 2026

Мартовский апгрейд: обновляем компетенции со скидкой 20% и приятными бонусами

Март — традиционное время не только для обновления природы, но и для профессионального роста. С 1 по 31 марта 2026 года у нас действует акция «Мартовский апгрейд».

05 марта 2026

Февраль 2026: Разбираем тренды, прокачиваем архитектуру и учимся договариваться с ИИ. Бесплатные вебинары для ИТ-специалистов

Февраль — месяц, когда уже видны цели на год, но еще есть время скорректировать курс и зарядиться новыми знаниями.

Новости
06 февраля 2026

Как ИТ-компании могут компенсировать до 10 млн ₽ на обучении сотрудников в 2026 году

Как аккредитованный учебный центр, специализирующийся на подготовке ИТ-специалистов, мы не только проводим программы дополнительного профессионального образования, но и помогаем корпоративным клиентам корректно оформить документы для участия в программе «Субсидия на обучение сотрудников» Департамента предпринимательства и инновационного развития города Москвы. В этой статье — структурированный обзор условий, требования к компаниям и сотрудникам, а также как мы можем помочь вам при подаче заявки.

Жизнь компании
20 января 2026

Архитекторы vs Рутина: Как открытый вебинар за 2 недели превратился в кастомный ИИ-интенсив

В Учебном центре IBS мы регулярно проводим бесплатные вебинары для ИТ-специалистов. Это наша философия — делиться реальными знаниями, а не просто давать рекламу. Один из таких вебинаров, посвященный практическому применению ИИ в инженерии, посетили сотрудники крупной компании — лидера в спортивном ритейле.

12 января 2026

Чистая выдумка: Как придумать класс, которого нет, и спасти проект от хаоса

Знакомо: вы описываете требования, рисуете сущности — Клиент, Заявка, Документ… А потом система превращается в «комок» с сильной связанностью (big ball of mud), где любое изменение стоит как полпроекта?

Новости
16 декабря 2025

Федеральное признание: нашу программу по системному анализу признали лучшей ИТ-программой в стране

Программа Учебного центра IBS «Системный аналитик. Уровень Специалист» признана лучшей ИТ-программой онлайн-обучения в России по итогам премии «СМАРТ ПИРАМИДА — 2025»!

16 декабря 2025

Бизнес-аналитик 2.0: как меняется профессия и какие навыки теперь нужны

Когда-то бизнес-аналитик ассоциировался с человеком, который «пишет ТЗ». Сегодня этого явно недостаточно. Современный БА — это стратег, коммуникатор и системный мыслитель, который одинаково уверенно чувствует себя в бизнес-контексте и технических деталях. Чтобы не застрять в прошлом, важно понимать, как эволюционирует роль аналитика и какие компетенции становятся критически важными.

Новости
05 декабря 2025

Обратная сторона Event-Driven: Почему Мартин Фаулер призывает к осторожности?

Вы узнаете один из 4 ключевых паттернов EDA и поймете, как избежать главной ловушки, в которую попадают многие команды.

Новости
25 ноября 2025

Скидка 30% на 8 курсов декабря

Год близится к завершению, и пока другие подводят итоги, вы можете сделать самую выгодную инвестицию — в себя. Мы собрали 8 курсов со скидкой 30%*, которые стартуют в начале декабря, чтобы вы могли точно успеть пройти обучение до конца года и прийти к новым карьерным целям с обновлённым стеком технологий.

Новости
20 ноября 2025

Осенний апдейт карьеры: от -30% до -50% на курсы ноября!

Только сейчас: скидки от 30% до 50%* на ноябрьские курсы для тех, кто хочет быть на шаг впереди в IT. Практические программы помогут укрепить ключевые навыки и выйти на новый уровень профессиональной зрелости. Успейте подать заявку, чтобы воспользоваться предложением.

Новости
23 октября 2025

Как одновременно заварить кофе для 10 000 сотрудников — и еще 7 неожиданных вопросов архитектору ПО

Как убедить заказчика отказаться от Excel, зачем архитектору опыт кодинга и почему эволюция ПО похожа на эволюцию живых существ?

Новости
21 октября 2025

Как живые вебинары повышают эффективность ИТ-обучения

ИТ-рынок сегодня меняется стремительнее, чем когда-либо: появляются новые технологии, фреймворки и подходы.

Новости
06 октября 2025

ИИ в разработке ПО: преимущество или риск

Инструменты на базе искусственного интеллекта все чаще используются при создании программного обеспечения. Рассмотрим, какие задачи помогает решать ИИ и какие опасности несет

Новости
24 сентября 2025

Чему нас учит ИИ: как стать идеальным сотрудником

Сейчас чаще говорят об этике использования ИИ — как не получить плагиат или не доверить слишком много, но при этом редко задумываются о другой стороне медали: этична ли наша работа?

Новости
12 сентября 2025

Как ИИ действительно влияет на продуктивность разработчика: неожиданные выводы из исследований

За последние пару лет у многих разработчиков в редакторах и IDE поселились новые «напарники» — всевозможные ИИ-инструменты. Обещания были впечатляющие: меньше рутины, быстрее релизы, код пишется почти сам. Но когда первые восторги улеглись и появились системные исследования, стало ясно: эффект от ИИ далеко не такой однозначный. Где-то он действительно ускоряет работу команд на 20%, а где-то, наоборот, тормозит опытных инженеров. И вот парадокс: даже там, где выигрыш в скорости очевиден, бизнес не всегда чувствует, что проекты двигаются быстрее.

Новости
08 сентября 2025

Нужна помощь? Оставьте заявку, и мы свяжемся с вами в ближайшее время

Согласен получать на e-mail информационные рассылки о новостях Учебного центра IBS
Корпоративное обучение Оценка персонала Сертификация О нас Стать тренером Блог Личный кабинет
Пользователь только что записался на курс ""
Спасибо!
Форма отправлена успешно.