
function deepClone(value, weakMap = new WeakMap()) {
if (value === null || typeof value !== 'object') {
return value;
}
if (weakMap.has(value)) {
return weakMap.get(value);
}
if (value instanceof Date) {
return new Date(value);
}
if (value instanceof RegExp) {
const re = new RegExp(value.source, value.flags);
re.lastIndex = value.lastIndex;
return re;
}
if (value instanceof Map) {
const result = new Map();
weakMap.set(value, result);
value.forEach((v, k) => {
result.set(deepClone(k, weakMap), deepClone(v, weakMap));
});
return result;
}
if (value instanceof Set) {
const result = new Set();
weakMap.set(value, result);
value.forEach(v => {
result.add(deepClone(v, weakMap));
});
return result;
}
const result = Array.isArray(value) ? [] : Object.create(Object.getPrototypeOf(value));
weakMap.set(value, result);
Reflect.ownKeys(value).forEach(key => {
result[key] = deepClone(value[key], weakMap);
});
return result;
}