深浅拷贝概念
浅拷贝:复制原有对象的地址值存入栈中,并指向原有对象堆空间数据
原有对象和拷贝对象的地址值指向同一个内存空间,并且具有
共享和连环性
深拷贝:复制原有对象的具体内容,并在栈中自主生成一个地址值(与原有对象地址值不 同),和堆中的一个新内存空间(与原有对象数据相同)并指向该内存。原有对象和新对象具有互不干涉性
浅拷贝方法
1、Object.asssign(目标对象,新对象)
2、var obj1={}
for(var key in obj1){
obj1[key]=obj2[key]
}
3、 var obj={}
var obj1={...obj}
深拷贝方法
1 、使用JSON进行深拷贝,在所以该方法时无法处理对象循环调用(obj.a=obj)
有一下报错
var obj1={}
var obj2=JSON.pores(JSON.stringify(obj1))
2、(手撕面试官方法在此)
使用MessageChannel()构造函数,可以解决对象循环调用的情况
原理:MessageChannel()构造函数,实例化了一个Channel对象,当iframe加载完毕
MessagePort.Post.Message方法会传递一条消息和MessageChannel.Port2给 iframe,handleMessage将会接收该消息并放入innerHTML中
//此处采用封装
funtion colne(obj){
return new Promise(reslove()=>{
const {port1,port2}= new MessageChannel()
port1.postmessage(obj)
port2.onmessage=(msg)=>{
reslove(msg.data)
}
})
}