Skip to main content

深浅拷贝

基础概念

浅拷贝&深拷贝

之所以会出现深拷贝,主要是因为弥补浅拷贝的一些缺点:

  • 会忽略 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)
});

(无法解决函数拷贝)