← Назад к вопросам

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

2.0 Middle🔥 163 комментариев
#JavaScript Core

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Общие принципы копирования объектов в JavaScript

В JavaScript копирование объектов — это нетривиальная задача, которая зависит от типа копирования (поверхностное или глубокое) и контекста использования. Рассмотрим основные подходы.

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

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

Методы поверхностного копирования:

  1. Оператор spread ... (ES6+):
const original = { a: 1, b: { c: 2 } };
const copy = { ...original };
  1. Object.assign():
const copy = Object.assign({}, original);
  1. Для массивов Array.prototype.slice() или spread:
const arrCopy = [...originalArray];
const arrCopy2 = originalArray.slice();

Ограничение: при изменении вложенного объекта изменения отразятся в обоих объектах:

original.b.c = 3;
console.log(copy.b.c); // 3 - изменилось и в копии!

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

Глубокое копирование рекурсивно копирует все вложенные объекты, создавая полностью независимую копию.

Методы глубокого копирования:

  1. JSON.parse(JSON.stringify(obj)):
const deepCopy = JSON.parse(JSON.stringify(original));

Недостатки:

  • Не копирует функции, undefined, Symbol
  • Ломает циклические ссылки
  • Преобразует Date в строки
  1. Библиотечные решения:
  • Lodash: _.cloneDeep(obj)
  • jQuery: $.extend(true, {}, obj)
  1. Современный нативный способ (2024+):
const deepCopy = structuredClone(obj);

Преимущества structuredClone:

  • Поддерживает большинство типов
  • Обрабатывает циклические ссылки
  • Стандартный API

Сравнение методов копирования

МетодТип копированияПоддерживает функцииЦиклические ссылки
...spreadПоверхностноеДаНет
Object.assignПоверхностноеДаНет
JSON.parse/stringifyГлубокоеНетНет
structuredCloneГлубокоеНетДа

Практические рекомендации

  1. Выбор подхода:

    • Для простых объектов без методов → structuredClone
    • Если нужны функции → _.cloneDeep
    • Для React state → ...spread для поверхностного обновления
  2. Производительность:

    • JSON.parse/stringify — медленнее из-за парсинга
    • structuredClone — оптимальнее для нативных объектов
    • Библиотечные методы — баланс возможностей и скорости
  3. Особые случаи:

    • Классы и конструкторы: требуется ручное копирование
    • Map/Set: поддерживаются в structuredClone
    • Буферы данных: ArrayBuffer тоже копируется

Важно: при проектировании приложений учитывайте необходимость копирования на ранних этапах — это влияет на архитектуру и производительность.

Копировал ли объект | PrepBro