function deepClone(target, cache = new Map()) {
let dist
if(cache.get(target)) {
return cache.get(target)
}
if(target instanceof Object) {
if(typeof target === Array.isArray(target)) {
dist = []
} else if(target instanceof Function) {
dist = function() {
return target.call(this, ...arguments)
}
} else if(target instanceof Date) {
dist = new Date(target)
} else if(target instanceof RegExp) {
dist = new RegExp(target.source, target.flags)
} else {
dist = {}
}
cache.set(target, dist)
for(let key in target) {
if(target.hasOwnProperty(key)){
dist[key] = deepClone(target[key]);
}
}
} else {
dist = target
}
return dist
}