function isObject(obj) { return typeof obj === 'object' && obj != null; }
const deepClone =(source, hash = new WeakMap())=>{
if(!isObject(source)) return source;
if(hash.has(source)) return has.get(source)
const target = Array.isArray(source) ? [] : {};
hash.set(source, target);
for( key in source){
if(Object.prototype.hasOwnProperty.call(source, key)){
target[key] = deepClone(source[key], hash)
}
}
return target;
}