SOURCE

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 命令行工具 X clear

                    
>
console