Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: shallow copy, deep copy, object mutation, reference, JavaScript

Что произойдет при изменении вложенных объектов после копирования?

Вопрос проверяет понимание поверхностного и глубокого копирования объектов в JavaScript, что критично для избежания неожиданных мутаций данных.

Короткий ответ

При изменении вложенных объектов после поверхностного копирования изменения затронут и исходный объект, так как копируются только ссылки на вложенные объекты. Глубокое копирование создаёт полностью независимую копию, включая все вложенные уровни. Это важно для иммутабельных обновлений в React или при работе с состоянием. Для глубокого копирования используйте structuredClone, JSON методы или библиотеки вроде Lodash.

Длинный ответ

В JavaScript объекты передаются и копируются по ссылке. Это означает, что при создании переменной, которая ссылается на существующий объект, или при поверхностном копировании (например, с помощью оператора spread ... или Object.assign), копируются только свойства верхнего уровня. Вложенные объекты (или массивы) внутри исходного объекта не копируются, а лишь передаются по ссылке.

Поверхностное копирование (Shallow Copy)

Рассмотрим пример с использованием оператора spread:

const original = {
  name: 'Test',
  details: { id: 1, value: 'secret' }
};

const shallowCopy = { ...original };
// Меняем свойство верхнего уровня — безопасно
shallowCopy.name = 'Changed';
console.log(original.name); // 'Test' — не изменилось

// Меняем вложенный объект — ОПАСНО!
shallowCopy.details.value = 'exposed';
console.log(original.details.value); // 'exposed' — изменилось и в original!

Как видно, изменение shallowCopy.details повлияло на original.details, потому что оба свойства хранят ссылку на один и тот же объект в памяти.

Глубокое копирование (Deep Copy)

Чтобы избежать этой проблемы, необходимо создать глубокую копию, где рекурсивно копируются все вложенные структуры. Есть несколько способов:

  • structuredClone (современный, поддерживает многие типы):
    const deepCopy = structuredClone(original);
    deepCopy.details.value = 'safe';
    console.log(original.details.value); // 'secret' — исходный не тронут
  • JSON.stringify/JSON.parse (работает с JSON-сериализуемыми данными, теряет функции, undefined, циклы):
    const deepCopy2 = JSON.parse(JSON.stringify(original));
  • Библиотеки (например, Lodash _.cloneDeep).

Где это важно?

Понимание разницы критично в нескольких сценариях:

  • Управление состоянием в React/Redux: состояние должно обновляться иммутабельно. Непреднамеренная мутация может привести к багам и неправильным ререндерам.
  • Работа с конфигурациями или данными: когда нужно модифицировать копию объекта, не затрагивая исходные настройки.
  • Функциональное программирование: функции, которые не должны иметь побочных эффектов (pure functions).

Вывод: всегда анализируйте структуру данных, которые копируете. Для простых объектов без вложенностей достаточно поверхностного копирования. Если объект содержит другие объекты или массивы, и вы планируете их изменять, используйте глубокое копирование, чтобы изолировать изменения и избежать трудноуловимых ошибок.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#shallow copy

#deep copy

#object mutation

#reference

#JavaScript

Подпишись на React Developer в телеграм