JavaScript

Глубокое клонирование объекта

Algonexys · 07.08.2026 · 👁 0

structuredClone из современных браузеров и запасная рекурсивная реализация для Date, Map, Set и массивов.

Код

// Современный способ (Node 17+, все актуальные браузеры):
const copy = structuredClone({ a: 1, nested: { b: [1, 2, 3] }, d: new Date() });

// Запасной вариант, если structuredClone недоступен:
function deepClone(value, seen = new WeakMap()) {
  if (value === null || typeof value !== 'object') return value;
  if (seen.has(value)) return seen.get(value);          // циклические ссылки

  if (value instanceof Date) return new Date(value);
  if (value instanceof RegExp) return new RegExp(value.source, value.flags);
  if (value instanceof Map) {
    const map = new Map();
    seen.set(value, map);
    value.forEach((v, k) => map.set(k, deepClone(v, seen)));
    return map;
  }
  if (value instanceof Set) {
    const set = new Set();
    seen.set(value, set);
    value.forEach((v) => set.add(deepClone(v, seen)));
    return set;
  }

  const result = Array.isArray(value) ? [] : {};
  seen.set(value, result);
  for (const [key, val] of Object.entries(value)) {
    result[key] = deepClone(val, seen);
  }
  return result;
}