一招快速区分深拷贝和浅拷贝!

35 阅读1分钟

一招快速区分深拷贝和浅拷贝!

先上结论: 除了JSON.parse(JSON.Stringify(obj))和手写深拷贝方法,其他都可以认为是浅拷贝。

核心知识点: 基本类型的拷贝是直接值拷贝,引用类型的拷贝是引用地址的拷贝。因此,只要是共用了引用地址,任意一个引用者发生变化都会影响其他引用者。

应用场景: 如果希望新对象和原对象完全独立不相互影响,使用深拷贝,其他情况可根据实际需要确定使用浅拷贝或者深拷贝。

深拷贝的方法

  • 方法1:
let obj_copy = JSON.parse(JSON.stringify(obj))
  • 方法2:
// 手写深拷贝
function deepCopy(obj) {
  if (typeof obj !== 'object') return obj
  let newObj = Array.isArray(obj) ? [] : {}
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      //基本类型的值直接复制,引用类型的值递归调用
      newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key]
    }
  }
  returnnewObj
}

浅拷贝的方法

部分示例:

 1.Object.create(obj)
 2.Object.assign({},obj)
 3.concat():数组的方法,里面包含引用类型元素
 4.slice():数组的方法,里面包含引用类型元素
 5.解构
 6.arr.toRreversed().reverse():两次反转

写在后面: 最近离职了,正在找工作,提了离职后才发现工作真难找,远比自己想象的要难得多,尽管试出了水有多深,也看明白了前方的路不好走,尽管老板也说你不想走随时可以留下,无论这句话真假,哈哈哈,都决心要走!因为困难是当下,但是自己看清的和要坚持走下去的路却仅非当下,所以,祝自己好运吧,也祝当前也在找工作的小伙伴们好运。