实现深拷贝

79 阅读1分钟

1 递归

function deepClone(obj) {
  var objClone = Array.isArray(obj) ? [] : {}
  if (obj && typeof obj === 'object' && obj != null) {
    // 判断obj存在并且是对象类型的时候 因为null也是object类型,所以要单独做判断
    for (var key in obj) {
      if (obj.hasOwnProperty(key)) {
        // 判断obj中是否存在key属性
        if (obj[key] && typeof obj[key] === 'object') {
          // 判断如果obj[key]存在并且obj[key]是对象类型的时候应该深拷贝,即在堆内存中开辟新的内存
          objClone[key] = deepClone(obj[key])
        } else {
          // 否则就是浅复制
          objClone[key] = obj[key]
        }
      }
    }
  }
  return objClone
}

2JSON.parse(JSON.stringify) 对于一般常用的数据拷贝是可以的,但是遇到复杂的数据,比如date,正则,函数,值为undefinde的对象时,键值对直接被删除,就会出现问题

const clone=JSON.parse(JSON.stringify(obj))
 let obj={
      name: 'a',
      arr:[1,2,3],
      date: [new Date(1536627600000), new Date(1540047600000)],
      RegExp: new RegExp('\\w+'),
      job:undefined
    }
    let newObj=JSON.parse(JSON.stringify(obj));
    newObj.name='lily';
    console.log({obj,newObj})
    1.  RegExp: /\w+/
obj:
1.  arr: (3) [123]
1.  date: (2) [Tue Sep 11 2018 09:00:00 GMT+0800 (中国标准时间), Sat Oct 20 2018 23:00:00 GMT+0800 (中国标准时间)]
1.  job: undefined
1.  name: "a"
newObj:
1.  RegExp: {}
1.  arr: (3) [123]
1.  date: (2) ['2018-09-11T01:00:00.000Z''2018-10-20T15:00:00.000Z']
1.  name: "lily"

日期格式变为字符串了
正则变成了空对象,
值为undefinde的键值对直接被删除