// 1
// 1.如果obj里面存在时间对象,JSON.parse(JSON.stringify(obj))之后,时间对象变成了字符串。
// 2.如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象。
// 3.如果obj里有函数,undefined,则序列化的结果会把函数,undefined丢失。
// 4.如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null。
// 5.JSON.stringify()只能序列化对象的可枚举的自有属性。如果obj中的对象是有构造函数生成的,则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的构造函数constructor,即无法继续使用构造函数原型上的属性。
// 6.如果对象中存在循环引用的情况也无法正确实现深拷贝。
const o = JSON.parse(JSON.stringify(obj));
// 2
function isObject(val) {
return typeof val === "object" && val !== null;
}
function deepClone(obj, hash = new WeakMap()) {
if (!isObject(obj)) return obj;
if (hash.has(obj)) return hash.get(obj);
const res = Array.isArray(obj) ? [] : {};
hash.set(obj, res);
// Reflect.ownKeys(obj)=Object.getOwnPropertyNames(obj)+Object.getOwnPropertySymbols(obj)
[
...Object.getOwnPropertyNames(obj),
...Object.getOwnPropertySymbols(obj),
].forEach(key => {
res[key] = deepClone(obj[key], hash);
});
return res;
}
本文是由用户"admin"发布,所有内容的版权归原作者所有。