简易版的实现深拷贝
很久没有发文章了,有点沉迷毒奶粉,忘了自己。
最近公司招人,发现各位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