Skip to content

深拷贝和浅拷贝

浅拷贝

浅拷贝:如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是内存地址。即浅拷贝是拷贝一层,深层次的引用类型则共享内存地址。常用的方法有:object.assgin,扩展运算符等等

ts
  const a={count:1,deep:{count:2}}
  const b = Object.assign({}, a);
  //实现一个浅拷贝
  function shallowClone(obj) {
    const newObj ={}
    for(item in obj)
    {
      if(obj.hasOwnProperty(item))
      {
        newObj[item]=obj[item]
      }
    }
    return  newObj
  }

深拷贝

深拷贝:开辟一个新的栈,两个对象的属性完全相同,但是对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

ts
function deepClone(obj, map = new Map()) {
  if (obj === null) return obj // 如果是null或者undefined我就不进行拷贝操作
  if (obj instanceof Date) return new Date(obj)
  if (obj instanceof RegExp) return new RegExp(obj)
  if (typeof obj !== 'object') return obj
  if (map.get(obj)) {
    return map.get(obj);
  }

  let res = {}
  if (obj instanceof Array || Object.prototype.toString(obj) === "[object Array]") {
    res = []
  }
  //防止循环引用
  map.set(obj, res)
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      res[key] = deepClone(obj[key], map)
    }
  }
  return result
}