Как скопировать объект
Вопрос
Какими способами можно скопировать объект в JavaScript? Чем они отличаются?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Присваивание копирует ссылку, а не объект
Поверхностная копия: spread, `Object.assign`, для массивов `slice` и `Array.from`
Глубокая копия: `structuredClone`, её ограничения (функции, DOM, прототипы)
`JSON.parse(JSON.stringify())` и что он теряет
Своя рекурсивная функция или библиотека для особых случаев
Часто копия не нужна целиком: достаточно неизменяемо обновить нужный путь
Что могут спросить следом
- Как скопировать объект с циклической ссылкой?
- Что будет с экземпляром класса после
structuredClone? - Как сравнить два объекта по содержимому?
Разбор
Образцовый ответ: «Сначала важно, что const b = a ничего не копирует: обе переменные указывают на один объект. Поверхностную копию делают через spread { ...obj } или Object.assign({}, obj), для массивов через spread или slice. Копируется только верхний уровень, вложенные объекты общие, и их изменение видно в оригинале. Для глубокой копии сейчас есть встроенный structuredClone: он справляется с вложенностью, циклами, датами, Map и Set. Но функции он не копирует, бросает ошибку, и прототип класса теряется, получится простой объект. Старый способ через JSON теряет undefined и функции, превращает даты в строки, а Map в пустой объект и падает на циклах. В остальных случаях пишут рекурсивный deepClone с WeakMap для циклов. На практике, например в React, полная копия обычно не нужна: я копирую только тот путь, который меняю».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.