Что такое поверхностное и глубокое копирование объектов в JavaScript
Что проверяют
Понимаете ли вы, что объекты хранятся по ссылке, и знаете ли современные способы копирования, а не только JSON.parse(JSON.stringify(x)).
Как отвечать
Присваивание объекта копирует ссылку, а не данные: два имени указывают на одну структуру.
Поверхностная копия создаёт новый объект, но вложенные объекты в нём те же самые:
const copy = { ...user }; // или Object.assign({}, user)
copy.address.city = "Казань"; // изменится и в оригиналеГлубокая копия воспроизводит всё дерево. Штатный способ с 2022 года это structuredClone:
const deep = structuredClone(user);Он умеет Date, Map, Set, RegExp, типизированные массивы и циклические ссылки. Чего не умеет: функции, Symbol и прототипы, на них бросает DataCloneError.
Старый приём через JSON работает, но молча портит данные: Date превращается в строку, undefined и функции пропадают, NaN и Infinity становятся null, циклическая ссылка роняет с ошибкой.
Практика: чаще нужна не глубокая копия, а неизменяемое обновление одного уровня ({ ...state, count: state.count + 1 }). Глубокая копия большого дерева стоит дорого, и её обычно можно не делать.
Где спотыкаются
Называют спред глубоким копированием.
Не знают structuredClone и предлагают JSON как единственный вариант.
Забывают, что массив объектов после slice() содержит те же самые объекты.
Не могут объяснить, почему в React нельзя мутировать состояние: сравнение идёт по ссылке, и мутация не вызывает перерисовку.