一、消息通道
采用消息通道,即可实现
代码语言:javascript复制function deepClone(obj) {
return Promise((resolve) => {
const { port1, port2 } = new MessageChannel();
port1.postMessage(obj);
port2.onmessage = (msg) => {
resolve(msg.data);
}
})
}
二、递归
使用递归
代码语言:javascript复制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);
}
三、ES6扩展运算符,一维对象则是深拷贝,二维及以上则是浅拷贝。
四、JSON.stringify然后JSON.parse,如果是简单数据数据类型则可,如果value为date、null等,则会出现类型丢失情况,同时相对增加性能损耗问题(Object内的key、value等类型都是在运行时确定的,所以stringify时需要很多工作要做)。