Перечислите все способы копирования объектов?
Этот вопрос проверяет знание различных способов создания копий объектов, что важно для работы с изменяемыми данными без изменения исходных объектов.
Короткий ответ
Объекты можно копировать несколькими способами. Поверхностное копирование можно сделать с помощью 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; }
Для ежедневной работы часто достаточно поверхностных копий, но если объект содержит вложенные структуры, лучше использовать глубокое копирование, чтобы избежать проблем с изменением данных по ссылке.