let obj = {c:1,d:()=>{}}
obj_ = {a:1,b:2}
obj__ = {a:()=>{},b:()=>{},c:1}
_obj = [1,2,3,1]
_obj_= 1
// 深拷贝
// JSON.parse(JSON.stringify())
// 局限性:
// 他无法实现对函数 、RegExp等特殊对象的克隆
// 会抛弃对象的constructor,所有的构造函数会指向Object
// 对象有循环引用,会报错
let o = JSON.parse(JSON.stringify(obj))
console.log(o)//{c:1}
//遍历 递归
// 对数据类型做判断
const deepClone = (obj)=>{
let o = {} //存结果
//判断是否为复杂类型(引用类型)
if(typeof obj === 'object' && obj !== null ){
//数组处理
if(Array.isArray(obj)){
o = [...obj]
}
//对象处理
for(let item in obj){
if(obj.hasOwnProperty(item)){
o[item] = deepClone(obj[item])
}else{
o = {...obj}
}
}
}else{
o = obj //普通类型
}
return o
}
// deepClone(obj)
console.log(deepClone(obj))//{ c: 1, d: [Function: d] }
console.log(deepClone(obj_))//{ a: 1, b: 2 }
console.log(deepClone(obj__))//{ a: [Function: a], b: [Function: b], c: 1 }
console.log(deepClone(_obj))//[ 1, 2, 3, 1 ]
console.log(deepClone(_obj_))//1
//精简
const deepClone_simple = (obj) =>{
let o = {};
//普通类型
(typeof obj !== 'object' || obj === null)&&(o = obj);
//复杂类型
//数组
Array.isArray(obj)&&(o = [...obj]);
for(let item in obj){
obj.hasOwnProperty(item)&&(o[item] = deepClone_simple(obj[item]));
}
return o;
}
简单深拷贝
最新推荐文章于 2022-04-07 08:00:00 发布