在这里插入代码片
//高级精简的写法,======此处是第一种写法
function deepClone(obj){
return new Promise((resolve)=>{
const {port1, port2}=new MessageChannel();
port1.postMessage(obj);
port2.onmessage=(msg)=>{
console.log(msg.data);//打印一下
resolve(msg.data);
};
});
}
let obj={a:1,b:2};
obj.c=obj;
deepClone(obj).then((res)=>{
console.log(res);
})
//比较常规的实现方式======此处是第二种写法
//==============此处顺便简单学习一下Map的用法
/*
其本质也是键值对,只是其键不局限于普通对象的字符串
let mymap=new Map([['name','莹'],['sex','女']]);
键值对:name=>莹,sex=>女。
map有has,get, delete,set,clear 五种方法,还有个size属性
*/
//深拷贝的循环引用问题
function deepClone(obj){
const objectMap=new Map();
const _deepClone=(value)=>{
const type=typeof value;
if(type !=='object'||type == null){
return value;
}
//之前有拷贝过吗?防止爆栈
if(objectMap.has(value)){
return objectMap.get(value);
}
//是对象
const result=Array.isArray(value)?[]:{};
//存储当前拷贝的对象,以及我们要返回的对象
objectMap.set(value,result);
for(const key in value){
//不管是不是对象,直接递归,外面的typeof会检测类型帮助我们判断是否遍历
result[key]=_deepClone(value[key]);
}
return result;
}
return _deepClone(obj);
}
//运行,控制台打印
let obj={a:1,b:2};
obj.c=obj;
console.log(deepClone(obj));//此处为循环引用
09-28
2950
10-17
202
12-10
2万+
09-12
367
08-28
249
08-01
9045