Какие способы клонирования объектов ты знаешь?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Нужно показать, что известно различие между поверхностным и глубоким клонированием, а также их ограничения. Важно понимать, что способ копирования выбирается в зависимости от того, есть ли во вложенных данных ссылки на изменяемые объекты. Хороший ответ обычно включает Object.assign, spread-оператор, ручное клонирование, structuredClone и сериализацию, но с оговорками по их применимости.
Определение:
Клонирование объекта — это создание его копии с теми же данными.
При поверхностном копировании дублируется только сам объект, а вложенные объекты и массивы остаются общими ссылками.
При глубоком копировании создаётся независимая копия вместе со всеми вложенными структурами.
Пример использования:
Например, в форме нужно изменить состояние без мутаций исходного объекта. Если структура простая, можно сделать поверхностную копию. Если внутри есть вложенные объекты и массивы, нужен глубокий клон.
const user = {
name: "Alex",
address: {
city: "Moscow"
},
roles: ["admin"]
};
// Поверхностная копия
const shallowCopy = { ...user };
// Глубокая копия
const deepCopy = structuredClone(user);
shallowCopy.name = "Bob";
shallowCopy.address.city = "Kazan";
console.log(user.name); // "Alex"
console.log(user.address.city); // "Kazan" — вложенный объект общий
deepCopy.address.city = "Sochi";
console.log(user.address.city); // "Kazan" — deep copy независим
Пояснение кода:
В примере shallowCopy создаётся через spread-оператор. Он копирует только верхний уровень объекта: поле name становится независимым, но address и roles остаются ссылками на те же вложенные объекты. Поэтому изменение shallowCopy.address.city влияет на user.address.city.
structuredClone(user) создаёт глубокую копию: вложенные структуры тоже копируются, и изменения в deepCopy не затрагивают исходный объект.
Если код для глубокого клонирования через сериализацию, это обычно выглядит так:
const copy = JSON.parse(JSON.stringify(user));
Этот способ тоже делает глубокую копию для простых JSON-совместимых данных, но теряет undefined, функции, Date, Map, Set, RegExp, а также ломается на циклических ссылках.
Ключевые моменты:
- Поверхностное копирование подходит для плоских объектов без вложенных изменяемых структур.
- Глубокое копирование нужно, когда важно полностью развязать исходный объект и копию.
Object.assignи spread-оператор делают только shallow copy.structuredClone— удобный вариант для deep copy, если среда его поддерживает.JSON.stringify/parseгодится только для простых JSON-данных и имеет ограничения.- Для сложных объектов и специфичных типов часто нужно ручное клонирование или специализированные библиотеки.