В JavaScript объекты копируются по ссылке. Если вы просто напишете const user2 = user1, то изменяя свойства в user2, вы автоматически измените их и в user1.
Для создания независимой копии (поверхностной) мы часто используем спред-оператор: const user2 = { ...user1 }. Но если внутри объекта есть вложенные объекты или массивы, спред не сработает – ссылки на внутренние структуры останутся прежними.
Как мы выкручивались раньше для глубокого копирования?
Настоящий костыльный хит: JSON.parse(JSON.stringify(obj)) – медленный, ломает даты, функции и RegExp.
Подтягивали тяжелые сторонние библиотеки вроде Lodash (_.cloneDeep()).
Современное решение:
Теперь в JavaScript есть нативный метод structuredClone(), который делает глубокое копирование одной строчкой кода без всяких библиотек
const original = {
name: "Тигран",
skills: ["HTML", "CSS", "Vue"],
meta: {
role: "Frontend Developer"
}
};
// Делаем глубокую копию
const copy = structuredClone(original);
// Проверяем: меняем вложенный массив в копии
copy.skills.push("TypeScript");
console.log(original.skills); // ["HTML", "CSS", "Vue"] -> оригинал НЕ изменился!
console.log(copy.skills); // ["HTML", "CSS", "Vue", "TypeScript"]
Что умеет structuredClone()?
В отличие от трюка с JSON, он корректно копирует цикличные ссылки (когда объект ссылается сам на себя).
Отлично справляется с встроенными типами данных: Date, Set, Map, RegExp, ArrayBuffer.
Единственное ограничение: Он не умеет копировать функции или DOM-узлы (вызовет ошибку). Но для чистых данных – это абсолютный мастхэв, работающий прямо из коробки во всех браузерах и Node.js.
#js
