// 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; }