js对象的深拷贝

225 阅读1分钟

方法1: JSON暴力转换

企业微信截图_16812616768528.png

可以看到,say方法和age没有了,birthday变成了字符串

该方法会忽略掉方法和undefined还有Symbol也会被忽略,只适用于不存在这些属性的对象

方法2:扩展运算符

企业微信截图_1681262347162.png

方法,undefined,Symbol和日期没有问题,但是更深一层的对象没有被深拷贝,该方法只适用于只有一级属性的对象

方法3: Object.assign()

企业微信截图_16812626392308.png

该方法注意事项及实用场景同上

方法3:老老实实遍历递归拷贝

function deepClone(obj) {
  if (typeof obj !== 'object') return obj;
  if (obj === null) return obj;
  if (obj instanceof RegExp) return obj;
  if (obj instanceof Date) return obj;
  let newObj = new obj.constructor();
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = deepClone(obj[key]);
    }
  }
  return newObj;
}

企业微信截图_16812630783251.png

完美解决以上所有问题

这里为什么用 let newObj = new obj.constructor();obj.constructor()无论是数组还是对象都能复制出他的类型,省去做object和array的判断