Этот вопрос проверяет знание различных способов создания копий объектов, что важно для работы с изменяемыми данными без изменения исходных объектов.
Объекты можно копировать несколькими способами. Поверхностное копирование можно сделать с помощью Object.assign(), оператора распространения { ...obj }, а для глубокого копирования часто используют JSON.parse(JSON.stringify(obj)). Поверхностная копия копирует только верхний уровень свойств, в то время как глубокая копия копирует все уровни объекта, включая вложенные.
В JavaScript есть несколько способов копирования объектов, и они делятся на поверхностные и глубокие копии.
Поверхностные копии:
Object.assign(): Создает новую копию объекта, копируя свойства только верхнего уровня. Вложенные объекты копируются по ссылке.
let original = { a: 1, b: { c: 2 } };
let copy = Object.assign({}, original);
copy.b.c = 3;
console.log(original.b.c); // 3, так как вложенный объект скопирован по ссылке.Оператор расширения (...): Работает аналогично Object.assign(), создавая поверхностную копию объекта.
let original = { a: 1, b: { c: 2 } };
let copy = { ...original };Глубокие копии:
JSON.parse(JSON.stringify()): Простой способ создать глубокую копию, однако он не работает с функциями и другими специальными объектами (например, Date, Map, Set).
let original = { a: 1, b: { c: 2 } };
let copy = JSON.parse(JSON.stringify(original));
copy.b.c = 3;
console.log(original.b.c); // 2, так как объект был полностью скопирован.Рекурсивная функция: Для создания глубокой копии, которая корректно работает со сложными структурами, можно использовать рекурсивные функции или специальные библиотеки вроде Lodash.
function deepCopy(obj) {
return Array.isArray(obj)
? obj.map(deepCopy)
: typeof obj === 'object'
? Object.keys(obj).reduce((acc, key) => {
acc[key] = deepCopy(obj[key]);
return acc;
}, {})
: obj;
}Для ежедневной работы часто достаточно поверхностных копий, но если объект содержит вложенные структуры, лучше использовать глубокое копирование, чтобы избежать проблем с изменением данных по ссылке.