深浅拷贝
基础概念
浅拷贝&深拷贝
之所以会出现深拷贝,主要是因为弥补浅拷贝的一些缺点:
- 会忽略 undefined
- 不能序列化函数
- 不能解决循环引用的对象
常见方案
1、使用 MessageChannel
利用MessageChannel的postMessage(原理跟 worker的postMessage一样)
// 有undefined + 循环引用
let obj = {
a: 1,
b: {
c: 2,
d: 3,
},
f: undefined
}
obj.c = obj.b;
obj.e = obj.a
obj.b.c = obj.c
obj.b.d = obj.b
obj.b.e = obj.b.c
function deepCopy(obj) {
return new Promise((resolve) => {
const {port1, port2} = new MessageChannel();
port2.onmessage = ev => resolve(ev.data);
port1.postMessage(obj);
});
}
// 请记住`MessageChannel`是异步的这个前提!
deepCopy(obj).then((copy) => {
let copyObj = copy;
console.log(copyObj, obj)
console.log(copyObj == obj)
});
(无法解决函数拷贝)