Sobes.tech
Назад к вопросам
Middle
782
questionbank

Какие способы клонирования объектов ты знаешь?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Нужно показать, что известно различие между поверхностным и глубоким клонированием, а также их ограничения. Важно понимать, что способ копирования выбирается в зависимости от того, есть ли во вложенных данных ссылки на изменяемые объекты. Хороший ответ обычно включает Object.assign, spread-оператор, ручное клонирование, structuredClone и сериализацию, но с оговорками по их применимости.

Определение:

Клонирование объекта — это создание его копии с теми же данными.
При поверхностном копировании дублируется только сам объект, а вложенные объекты и массивы остаются общими ссылками.
При глубоком копировании создаётся независимая копия вместе со всеми вложенными структурами.

Пример использования:

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

const user = {
  name: "Alex",
  address: {
    city: "Moscow"
  },
  roles: ["admin"]
};

// Поверхностная копия
const shallowCopy = { ...user };

// Глубокая копия
const deepCopy = structuredClone(user);

shallowCopy.name = "Bob";
shallowCopy.address.city = "Kazan";

console.log(user.name); // "Alex"
console.log(user.address.city); // "Kazan" — вложенный объект общий

deepCopy.address.city = "Sochi";
console.log(user.address.city); // "Kazan" — deep copy независим

Пояснение кода:

В примере shallowCopy создаётся через spread-оператор. Он копирует только верхний уровень объекта: поле name становится независимым, но address и roles остаются ссылками на те же вложенные объекты. Поэтому изменение shallowCopy.address.city влияет на user.address.city.

structuredClone(user) создаёт глубокую копию: вложенные структуры тоже копируются, и изменения в deepCopy не затрагивают исходный объект.

Если код для глубокого клонирования через сериализацию, это обычно выглядит так:

const copy = JSON.parse(JSON.stringify(user));

Этот способ тоже делает глубокую копию для простых JSON-совместимых данных, но теряет undefined, функции, Date, Map, Set, RegExp, а также ломается на циклических ссылках.

Ключевые моменты:

  • Поверхностное копирование подходит для плоских объектов без вложенных изменяемых структур.
  • Глубокое копирование нужно, когда важно полностью развязать исходный объект и копию.
  • Object.assign и spread-оператор делают только shallow copy.
  • structuredClone — удобный вариант для deep copy, если среда его поддерживает.
  • JSON.stringify/parse годится только для простых JSON-данных и имеет ограничения.
  • Для сложных объектов и специфичных типов часто нужно ручное клонирование или специализированные библиотеки.