前端深拷贝

122 阅读1分钟

借用 @浪里行舟 大佬几句话

  • 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。

  • 深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。

//代码实现深拷贝
function deepClone(obj, weakmap = new WeakMap()) {
  //界限判断
  if (obj instanceof RegExp) {
    return new RegExp(obj)
  }
  if (obj instanceof Date) {
    return new Date(obj)
  }
  if (typeof obj !== 'object') {
    return obj
  }
  if (weakmap.has(obj)) {
    return weakmap.get(obj)
  }
  //优先选择
  let target = new obj.__proto__.constructor()
  weakmap.set(obj, target)
  // 优于 let target = Object.prototype.toString.call(obj)==='[object Array]'?[]:{}
  for (let i in obj) {
    if (obj.hasOwnProperty(i)) {
      if (typeof obj[i] === 'object') {
        target[i] = deepClone(obj[i], weakmap)
      } else {
        target[i] = obj[i]
      }
    }
  }
  return target
}