Получить доступ

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

JuniorОсновы JavaScript
Ещё спрашивают так:
  • Что такое structuredClone?
  • Почему JSON.parse(JSON.stringify()) — плохой способ копирования?
Коротко

Поверхностная копия ({...obj}, Object.assign, [...arr], slice) копирует только верхний уровень — вложенные объекты общие. Глубокая — structuredClone(obj) (встроенная, сохраняет Date, Map, Set, циклические ссылки). JSON-трюк теряет функции, undefined, Date и падает на циклах.

  • В React и Redux состояние обновляют неизменяемо — копируя изменённые уровни
  • structuredClone не копирует функции, DOM-узлы и прототипы классов
  • Присваивание const b = a — не копия, а та же ссылка

А ещё Immer позволяет «мутировать» черновик и получить неизменяемую копию

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Когда достаточно поверхностной копии: в иммутабельном стиле, где вложенные объекты тоже не меняются, а заменяются. Обновление React- состояния копирует только путь до изменённого поля.

Глубокая копия через JSON:

  • функции и undefined пропадают;
  • Date становится строкой, Map и Set — пустыми объектами;
  • NaN и Infinity становятся null;
  • циклические ссылки — исключение.

structuredClone (во всех современных браузерах и Node 17+) решает эти проблемы, но объект теряет класс — получается обычный объект.

Пример

const user = { name: "Аня", address: { city: "Казань" } };

const shallow = { ...user };
shallow.address.city = "Сочи";
user.address.city;            // "Сочи" — вложенный объект общий

const deep = structuredClone(user);
deep.address.city = "Омск";
user.address.city;            // "Сочи" — не изменился

const updated = { ...user, address: { ...user.address, city: "Пермь" } };

Что хотят услышать

  • Различие видов копий.
  • Способы и их ограничения.
  • Связь с иммутабельными обновлениями.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем