一、消息通道
采用消息通道,即可实现
function deepClone(obj) {
return Promise((resolve) => {
const { port1, port2 } = new MessageChannel();
port1.postMessage(obj);
port2.onmessage = (msg) => {
resolve(msg.data);
}
})
}
二、递归
使用递归
function deepClone(obj) {
const objectMap = new Map();
const _deepClone = (value) => {
const _typeof = typeof value;
const type = Object.prototype.toString.call(value);
// 此处仍需各种判断,如:date
if (_typeof !== ‘object’ || value === null || type === ‘[object Date]’ || type === ‘[object RegExp]’ || type === ‘[object Error]’) {
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);
}