JavaScript
Глубокое клонирование объекта
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;
}