Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: clone, deepcopy

Как выполнить глубокое копирование объекта?

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

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

Для глубокого копирования объектов используйте JSON.parse(JSON.stringify(obj)) для простых объектов, structuredClone() для современных браузеров, или библиотеки типа Lodash _.cloneDeep(). Ручная рекурсивная функция также подходит для сложных случаев. Каждый метод имеет свои ограничения и особенности.

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

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

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

1. JSON метод (простой, но с ограничениями):

const obj = { a: 1, b: { c: 2 } };
const copy = JSON.parse(JSON.stringify(obj));

// Ограничения:
// - Игнорирует функции, undefined, Symbol
// - Преобразует Date в строки
// - Теряет прототипы и конструкторы

2. structuredClone (современный стандарт):

// Нативный метод для глубокого копирования
const obj = { a: 1, b: { c: 2 } };
const copy = structuredClone(obj);

// Поддерживает:
// - Map, Set, Date, RegExp, ArrayBuffer
// - Циклические ссылки

3. Рекурсивная функция:

function deepClone(obj, hash = new WeakMap()) {
  if (obj === null || typeof obj !== 'object') return obj;
  if (hash.has(obj)) return hash.get(obj);
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof RegExp) return new RegExp(obj);

  const clone = Array.isArray(obj) ? [] : {};
  hash.set(obj, clone);

  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      clone[key] = deepClone(obj[key], hash);
    }
  }

  return clone;
}

4. Lodash cloneDeep:

const _ = require('lodash');
const copy = _.cloneDeep(original);

Пример с циклическими ссылками:

const obj = { a: 1 };
obj.self = obj;

// JSON метод упадет
// JSON.parse(JSON.stringify(obj)); // TypeError

// structuredClone работает
const copy = structuredClone(obj); // Успешно

Рекомендации:

  • Используйте structuredClone для современных приложений

  • Для legacy поддержки - Lodash или JSON метод

  • Для особых случаев - кастомную рекурсивную функцию

Уровень

  • Рейтинг:

    3

  • Сложность:

    6

Навыки

  • JavaScript

    JavaScript

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

#clone

#deepcopy

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