克隆
2. 深度克隆
const cache = new WeakMap();
function deepClone(value) {
if (typeof value !== "object" || value === null) {
return value;
}
const cached = cache.get(value);
if (cached) {
return cached;
}
const result = Array.isArray(value) ? [] : {};
Object.setPrototypeOf(result, Object.getPrototypeOf(value));
cache.set(value, result);
for (const key in value) {
if (value.hasOwnProperty(key)) {
result[key] = deepClone(value[key]);
}
}
return result;
}
function Test() {
this.a = 1;
this.b = 1;
}
Test.prototype.c = 3;
const obj = new Test();
深度克隆深拷贝
function deepClone(value) {
if (typeof value !== "object" || value === null) {
return value;
}
const cached = cache.get(value);
if (cached) {
return cached;
}
const result = Array.isArray(value) ? [] : {};
Object.setPrototypeOf(result, Object.getPrototypeOf(value));
cache.set(value, result);
for (const key in value) {
if (value.hasOwnProperty(key)) {
result[key] = deepClone(value[key]);
}
}
return result;
}
深拷贝特殊玩法
function deepClone(obj) {
return new Promise((resolve) => {
const { port1, port2 } = new MessageChannel();
port1.postMessage(obj);
port2.onmessage = () => {
resolve(msg.data);
};
});
}
2.1. 深拷贝循环引用问题
function deepClone(value) {
const cache = new WeakMap();
function _deepClone(value) {
if (value === null || typeof value !== "object") {
return value;
}
const result = Array.isArray(value) ? [] : {};
for (let key in value) {
if (value.hasOwnProperty(key)) {
result[key] = _deepClone(value[key]);
}
}
return result;
}
return _deepClone(value);
}