const obj = {
name:'obj.name',
un:undefined,
nu:null,
sy:Symbol(123),
say:function(){
console.log(this.name);
},
reg:/\d{6}/g,
date:new Date(),
child:{
name:'child.name'
}
};
obj.child.child = obj.child
function deepClone(target,map=new WeakMap()){
if(!isObject(target)) return target
if(map.has(target)) return map.get(target)
let res = Array.isArray(target)?[]:{}
map.set(target,res)
for(let i in target){
if(target.hasOwnProperty(i)){
if(isObject(target[i])){
res[i] = deepClone(target[i],map)
}else{
res[i]=target[i]
}
}
}
return res
}
function isObject(obj){
return Object.prototype.toString.call(obj)==='[object Object]'||Object.prototype.toString.call(obj)==='[object Array]'
}
let obj2 = deepClone(obj);
console.log(obj);
console.log(obj2);
console.log(obj2.sy === obj.sy)
obj2.name = 'obj2.name';
obj2.say();