1.正统版
function deepClone(obj) {
const objectMap = new Map();
const _deepClone = (value) => {
const type = typeof value;
if (type !== "object" || value === 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) {
result[key] = _deepClone(value[key]);
}
return result;
};
return _deepClone(obj);
}
const obj = {
'a' : 1,
'b' : {
'c': 2
}
}
obj.d = obj
console.log(deepClone(obj))
2.少见但牛逼版(异步)
function deepClone(obj) {
return new Promise((resolve) => {
const { port1, port2 } = new MessageChannel();
port1.postMessage(obj);
port2.onmessage((msg) => {
resolve(msg.data);
});
});
}
var obj = {'a': 1}
deepClone(obj).then(res => {
console.log('deep clone...', res)
})
3.炫技版
const obj = {
a: 1,
b: {
c: 2,
},
};
let newObj = window.structuredClone(obj)
console.log(newObj)