手撕深拷贝
递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝。
步骤:
- 终止条件,非对象或者null则终止
- 判断obj,是数组则定义结果为数组
- 判断key是否为对象的自有属性并递归调用深拷贝
function deepClone(obj){
//终止条件,非对象或者null则终止
if(typeof obj !== 'object' || obj ===null){
return obj;
}
//判断obj,是数组则定义结果为数组,
let newobj = obj instanceof Array ? []: {};
for(let key in obj){
if(obj.hasOwnProperty(key)){//判断key为对象的自有属性
newobj[key] = deepClone(obj[key]);//递归调用深拷贝
}
}
return newobj;
}
ts版本
export function deepClone(obj: any, hash = new WeakMap()) {
if (obj === null) return obj // 如果是null或者undefined我就不进行拷贝操作
if (obj instanceof Date) return new Date(obj)
if (obj instanceof RegExp) return new RegExp(obj)
// 可能是对象或者普通的值 如果是函数的话是不需要深拷贝
if (typeof obj !== 'object') return obj
// 是对象的话就要进行深拷贝
if (hash.get(obj)) return hash.get(obj)
let cloneObj = new obj.constructor()
// 找到的是所属类原型上的constructor,而原型上的 constructor指向的是当前类本身
hash.set(obj, cloneObj)
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
// 实现一个递归拷贝
cloneObj[key] = deepClone(obj[key], hash)
}
}
return cloneObj
}
代码验证:
const arr = [
{
a: () => {
console.log('aaaa');
},
},
{ a: 2 },
{ a: 3 },
];
const arr2 = deepClone(arr);
// 改变新的数组
arr2[0].a = () => {
console.log('bbbb');
};
arr2[1].a = 9;
arr[0].a(); // aaaa
arr2[0].a(); // bbbb
console.log(arr[1].a); // 2
console.log(arr2[1].a); // 9
阅读剩余
版权声明:
作者:chun
链接:https://chun53.top/847.html
文章版权归作者所有,未经允许请勿转载。
THE END