Проверяет понимание поверхностного и глубокого копирования объектов в JavaScript и умение выбирать подходящий способ клонирования.
Клонирование объекта — это создание новой сущности с теми же данными. Важно различать поверхностное (shallow) и глубокое (deep) копирование: при поверхностном копируются только ссылки на вложенные объекты, при глубоком — рекурсивно дублируется вся структура.
Самые популярные способы — spread-оператор и Object.assign. Они создают новый объект верхнего уровня, но вложенные объекты остаются общими.
const user = { name: 'Ann', address: { city: 'Moscow' } };
const copy1 = { ...user };
const copy2 = Object.assign({}, user);
copy1.address.city = 'Kazan';
console.log(user.address.city); // 'Kazan' — вложенный объект общийСовременный способ — structuredClone, встроенный в браузеры и Node.js 17+. Он корректно копирует Date, Map, Set, ArrayBuffer, но не поддерживает функции и DOM-узлы.
const deep = structuredClone(user);
deep.address.city = 'Sochi';
console.log(user.address.city); // 'Moscow' — оригинал не изменёнКлассический трюк JSON.parse(JSON.stringify(obj)) тоже даёт глубокую копию, но теряет функции, undefined, Date превращает в строку, а циклические ссылки ломают его.
Если нужен полный контроль над типами, пишут рекурсивную функцию, которая обходит объект и копирует вложенные структуры.
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
const clone = Array.isArray(obj) ? [] : {};
for (const key in obj) {
if (Object.hasOwn(obj, key)) clone[key] = deepClone(obj[key]);
}
return clone;
}Для сложных случаев применяют библиотеку lodash.cloneDeep, которая учитывает прототипы, Map, Set и циклические ссылки.
Итог: для плоских объектов достаточно spread или Object.assign, для вложенных структур используйте structuredClone, а если нужна поддержка функций и особых типов — lodash.cloneDeep или собственную рекурсию.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию