JSON.parse问题
- 时间对象变成字符串
- RegExp和Error对象会变成空对象
- 函数和undefied会丢失
- 有NaN,infinity为变成nul
- 如果对象由构造函数生成会丢失constructor属性的指向,指向Object
function deepClone(origin, map = new WeakMap()) {
if (origin === null || typeof origin !== "object") {
return origin;
}
// 日期正则单独处理
if (origin instanceof Date || origin instanceof RegExp) {
return new origin.constructor(origin);
}
var copied = map.get(origin);
if (!!copied) {
return copied;
}
let target = new origin.constructor();
map.set(origin, target);
let keys = Reflect.ownKeys(origin);
for (let key of keys) {
target[key] = deepClone(origin[key], map);
}
return target;
}