function deepCopy(obj, map = new Map()){
let toString = Object.prototype.toString.call(obj);
let target = null;
if(map.get(obj)){
return map.get(obj);
}
switch(toString){
case '[object Object]':
case '[object Array]':
target = toString === '[object Object]' ? {} : [];
map.set(obj, target);
for(let key in obj){
target[key] = deepCopy(obj[key], map)
}
break;
case '[object Set]':
target = new Set();
map.set(obj, target);
for(let key of obj){
target.add(deepCopy(key, map))
}
break;
case '[object Map]':
target = new Map();
map.set(obj, target);
for(let [key, value] of obj.entries()){
target.set(key, deepCopy(value, map))
}
break;
}
return target
}
var sourceObj = {
a: 1,
b: null,
c: undefined,
d: NaN,
e: 'test',
f: true,
g: [1,2,3],
h: {
a: 1,
b: null,
c: undefined
},
i: new Set([1,2,3]),
j: new Map([['a', 1]])
}
//sourceObj.t = sourceObj;
var targetObj = deepCopy(sourceObj);
console.log(targetObj)
console