Ответ вслух Junior Объекты и массивы обновлено

Копирование объектов

Вопрос

Как скопировать объект? Чем поверхностная копия отличается от глубокой?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

{...obj} и Object.assign копируют только первый уровень: вложенные объекты остаются общими, и мутация внутри заденет оригинал. Глубокую копию даёт structuredClone - он переживает циклы, Map, Set, Date, типизированные массивы, но не копирует функции.

Что должно прозвучать в ответе

  • spread и Object.assign копируют только верхний уровень

  • вложенные объекты остаются общими по ссылке

  • structuredClone делает глубокую копию и понимает Map, Set, Date, циклы

  • JSON.parse(JSON.stringify) теряет undefined, функции, Date превращает в строку

  • глубокая копия дорогая - в React обычно нужна не она, а неизменяемое обновление по пути

Что могут спросить следом

  • Как неизменяемо обновить поле на третьем уровне вложенности
  • Чем плоха глубокая копия состояния на каждый рендер
  • Что произойдёт с Map при JSON.stringify

Разбор

{...obj} и Object.assign копируют только первый уровень: вложенные объекты остаются общими, и мутация внутри заденет оригинал. Глубокую копию даёт structuredClone - он переживает циклы, Map, Set, Date, типизированные массивы, но не копирует функции.

JSON.parse(JSON.stringify(x)) - старый трюк с потерями: undefined и функции исчезают, Date становится строкой, циклы бросают исключение.

В React глубокая копия обычно не нужна: нужно неизменяемо обновить путь, оставив остальные ветки по ссылке - так memo и useMemo продолжают работать.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.