function deepClone(target, set = new Set()) {
if (!(target instanceof Object)) return target;
const { constructor } = target
if (constructor === Function) return target
if (constructor === Map) {
const result = new Map();
for (let [key, value] of target) {
result.set(key, deepClone2(value))
}
return result
}
if (constructor === Set) {
const result = new Set();
for (let item of target) {
result.add(deepClone2(item))
}
return result
}
if (set.has(target)) return target
set.add(target);
const result = Array.isArray(target) ? [] : {};
Reflect.ownKeys(target).forEach(key => {
result[key] = deepClone2(target[key], set)
})
return result
}