深拷贝
在JS中,数据类型分为基本数据类型和引用数据类型, 基本数据类型的值存储在栈内存中,引用类型则存储在堆内存中,栈内存中仅仅存储了堆内存的一个引用。
普通的 ” =“ 的赋值操作以及数组(对象)的方法仅是浅拷贝 |
为什么使用深拷贝
在改变新的数组(对象)的时候,不改变原数组(对象)
// 递归使用Reflect.ownKeys实现
const deepclone = function(obj){
const isobj = (obj)=>typeof obj === 'object' && typeof obj !== 'null'
if(!isobj) throw new Error("不是引用类型")
const res = Array.isArray(obj)?[...obj]:{...obj}
Reflect.ownKeys(res).forEach(key=>{
res[key]=isobj(res[key])?deepclone(res[key]):res[key]
})
return res
}
// =================
// 递归使用for in 实现
const deepclone = function(obj){
let objClone = Array.isArray(obj) ? [] : {};
if (obj && typeof obj === 'object') {
for(let key in obj){
if (obj[key] && typeof obj[key] === 'object'){
objClone[key] = deepclone(obj[key]);
}else{
objClone[key] = obj[key]
}
}
}
return objClone;
}
深拷贝其他方法 例如 JSON.stringify(obj)再用JSON.parse()解析就可, 有缺点 引用类型不可用此方法深拷贝
具体开发中可使用 lodash 工具库中的 cloneDeep()方法来实现