JavaScript·100 вопросов

Как глубоко скопировать объект?

Ответ

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

Самым современным и предпочтительным способом на сегодняшний день является использование встроенной функции structuredClone. Она корректно обрабатывает большинство встроенных типов данных, сохраняет циклические ссылки и является частью стандарта браузеров и Node.js.

Исторически популярный подход с сериализацией через JSON.parse(JSON.stringify(obj)) до сих пор встречается в чужом коде, но имеет критические ограничения. Он полностью удаляет методы функций, не умеет работать со специальными типами вроде Map, Set, Date и падает с ошибкой при циклических ссылках.

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

В крайних случаях, когда требуется специфическая бизнес-логика или строгий контроль над копируемыми типами, разработчики пишут собственные рекурсивные функции обхода свойств объекта.

Убедитесь, что вам действительно нужна глубокая копия, а не поверхностное дублирование ссылок.
Вызовите встроенную функцию structuredClone и передайте ей исходный объект в качестве аргумента.
Сохраните результат выполнения функции в новую переменную для дальнейшего использования.
Проверьте независимость измененных вложенных полей в новом объекте относительно оригинала.

Важно всегда помнить, что обычный оператор spread или метод Object.assign для глубокого копирования категорически не подходят. Они выполняют исключительно поверхностное копирование и дублируют ссылки на все внутренние вложенные объекты.

Полезен ли этот ответ?

Другие вопросы этой темы

Связанные вопросы из других тем