Как скопировать объект в JavaScript?
В JavaScript копирование объекта может быть:
- Поверхностным (shallow copy) — копируются только верхнеуровневые свойства, вложенные объекты копируются по ссылке.
- Глубоким (deep copy) — создаётся полная независимая копия, включая вложенные объекты и массивы.
Поверхностное копирование
Spread оператор "(...)"
const obj = { name: "Alice", age: 25 };
const copy = { ...obj };
- Просто и читаемо
- Только верхний уровень копируется
Object.assign()
const obj = { name: "Bob" };
const copy = Object.assign({}, obj);
- Альтернатива spread
- Тоже shallow copy
Глубокое копирование
JSON.parse(JSON.stringify(...))
const original = { user: { name: "Tom" } };
const deepCopy = JSON.parse(JSON.stringify(original));
- Удобно и просто
- Не копирует функции,
undefined
,Date
,Map
,Set
и т.д.
structuredClone() (встроенный способ)
const deepCopy = structuredClone(obj);
- Работает с большинством структур (в т.ч.
Map
,Set
,Date
,Blob
) - Безопасно и эффективно
- Требует поддержку браузером (поддерживается в современных)
Ручное копирование / библиотеки
lodash.cloneDeep
import cloneDeep from 'lodash/cloneDeep';
const deepCopy = cloneDeep(obj);
- Подходит для сложных объектов
- Проверенный и надёжный способ
Важно:
Простое копирование по ссылке (const copy = obj
) не создаёт новый объект — это ссылка на тот же самый объект в памяти.