就让风继续吹吧

贫瘠小行星,种一颗玫瑰

导航

js的深浅拷贝

1.浅拷贝

只是复制基本类型的数据或者指向某个对象的指针,而不是复制对象本身,源对象和目标对象共享同一块内存;如果对目标对象修改,那么源对象也会被修改。

  • 对象实现
const shallowClone = sourceObj => {
  let targetObj = {}
  for (const key in sourceObj) {
    targetObj[key] = sourceObj[key]
  }
  return targetObj
}
  • 数组实现
const shallowClone = sourceArr => {
  let targetArr = []
  targetArr = [].concat(sourceArr)
  return targetArr
}
  • Object.assign
const shallowClone = source => {
  return Object.assign({}, source)  
}

 

2.深拷贝

创建一个新的对象,重新分配堆内存地址,实现源对象和目标对象的完全分离。

  • JSON字符串化(缺点:function 会变成 undefined)
const deepClone = source => {
  return JSON.parse(JSON.stringify(source))
}
  • 递归
const deepClone = source => {
  if (source && typeof source === 'object') {
    let cloneObj = {}
    for (const key in source) {
      const val = source[key]
      if (val && typeof val === 'object') {
        cloneObj[key] = deepClone(val)
      } else {
        cloneObj[key] = val
      }
    }
    return cloneObj
  } else {
    return source
  }
}

 

posted on 2021-04-13 22:30  就让风继续吹吧  阅读(61)  评论(0编辑  收藏  举报