likes
comments
collection
share

简易版的实现深拷贝

作者站长头像
站长
· 阅读数 58

很久没有发文章了,有点沉迷毒奶粉,忘了自己。

最近公司招人,发现各位JS基础并不是很牢靠,提了个问题如何实现一个深拷贝,我让面试者简单写一个,80%都无从下笔,难怪说前端已死,这都不死是真没道理了。

好的含蓄的话就到这儿。让我们来看看,简单实现一个深拷贝的流程。

首先解答一下什么是深拷贝-引用一下大佬说的 juejin.cn/post/684490… (这是深拷贝和浅拷贝的概念,直接贴链接了,写的挺好的,各位直接看就好了)

深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象

概念明白了以后,咱们来讲讲实现思路,直接贴代码吧,代码中每一步做了什么,标注了注释。 在链接中,多次提到了循环引用

递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝

type OldData = {
  name: string;
  house: {
    highFloor: string;
    stall: string;
  };
  familyMembers: string[];
}
const oldData = {
  name: 'jackie',
  house: {
    highFloor: '麓湖大别墅',
    stall: '1995号'
  },
  familyMembers: ['王老狗', '邹老狗']
}
const cloneDeep = (oldObject: OldData) => {
  // 建立一个容器,先判断拷贝的是对象还是数组
  const newData = Array.isArray(oldObject) ? [] : {}
  // 循环遍历属性的值,把旧对象的值赋值给新对象
  for (const key in oldObject) {
    // 如果是引用数据类型,继续递归
    if (typeof oldObject[key] === 'object') {
      newData[key] = cloneDeep(oldObject[key])
    } else {
      // 否则是基本数据类型,直接赋值
      newData[key] = oldObject[key]
    }
  }
  // 新的返回出去
  return newData as OldData;
}
const testData = cloneDeep(oldData)
testData.house.stall = '车位卖了'
console.log(testData)

代码看完了,没看懂的多看几遍,这个是很简易版的了

ok我们来看看打印的值

简易版的实现深拷贝

嘿~瞧,这不成了吗?

末尾。告辞,别耽误我打游戏了,鬼泣宇宙无敌。

转载自:https://juejin.cn/post/7221921051147403324
评论
请登录