JavaScript·100 питань

Як глибоко скопіювати об'єкт?

Відповідь

Створення глибокої копії об'єкта в JavaScript необхідне тоді, коли потрібно повністю дублювати складну структуру даних з усіма вкладеними об'єктами та масивами. Це гарантує, що будь-які зміни в копії не торкнуться оригінального об'єкта.

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

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

У великих проєктах зі старою кодовою базою часто застосовують перевірені сторонні бібліотеки. Наприклад, утилітний метод cloneDeep з популярної екосистеми Lodash надійно вирішує всі проблеми глибокого клонування протягом багатьох років.

У крайніх випадках, коли потрібна специфічна бізнес-логіка або суворий контроль над типами, що копіюються, розробники пишуть власні рекурсивні функції обходу властивостей об'єкта.

Переконайтеся, що вам дійсно потрібна глибока копія, а не поверхневе дублювання посилань.
Викличте вбудовану функцію structuredClone і передайте їй вихідний об'єкт як аргумент.
Збережіть результат виконання функції в нову змінну для подальшого використання.
Перевірте незалежність змінених вкладених полів у новому об'єкті відносно оригіналу.

Важливо завжди пам'ятати, що звичайний оператор spread або метод Object.assign для глибокого копіювання категорично не підходять. Вони виконують виключно поверхневе копіювання і дублюють посилання на всі внутрішні вкладені об'єкти.

Чи корисна ця відповідь?

Інші питання цієї теми

Пов’язані питання з інших тем