SOURCE


/**
 * 深拷贝
 * @param {Object} obj 要拷贝的对象
 * @param {Map} map 用于存储循环引用对象的地址
 */

function deepClone(obj = {}, map = new Map()) {
  //-------如果非引用类型, 直接返回值本身-------------------
  if (typeof obj !== "object") {
     // ! == null array obj
     return obj;
  }
  //----------如果已存在该key值, 则返回该key的value----------------
  if (map.get(obj)) {
    return map.get(obj);
  }
  //---------初始化返回结果-----------------
  let result = {};
  //---------如果是数组, 则返回数组------------
  if (
    obj instanceof Array ||
    // 加 || 的原因是为了防止 Array 的 prototype 被重写,Array.isArray 也是如此
    Object.prototype.toString.call(obj) === "[object Array]"
  ) {
    result = [];
  }
  // 防止循环引用
  map.set(obj, result);
 
  //---------循环-----------------

        // 列: obj = { a:4,  b:5 };
        //     obj = [ 1, 2 , 3 , 4];
  for (const key in obj) {
    // 保证 key 不是原型属性
    if (obj.hasOwnProperty(key)) {
      // 递归调用
      debugger
      result[key] = deepClone(obj[key], map);
    }
  }
 
  //--------返回结果-----------------
  return result;
}

let str = [1,2,3,5];
let str2 = {
    a:4,
    b:5
};
let s1 = deepClone( str);
let s3 = deepClone( str2);
// s1[1] = 6;
s3.a = 8
// console.log(str)
console.log(str2)
// console.log(s1)
console.log(s3)
// console.log(deepClone('aaa'))

let map = new Map();
map.set('a',{aa:'123'})
map.set('b',{ab:'123'})
map.forEach((i)=>{
console.log(
    )
})
console 命令行工具 X clear

                    
>
console