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