/* 深拷贝实现函数 */ let deepClone = (val, wm = newWeakMap) => { if (val == null) return val; if (typeof val !== "object") return val; if (val instanceofDate) returnnewDate(val); if (val instanceofRegExp) returnnewRegExp(val); if (wm.has(val)) return wm.get(val); let _instance = new val.constructor; wm.set(val, _instance);
for (let key in val) { if (val.hasOwnProperty(key)) _instance[key] = deepClone(val[key], wm); } return _instance; }
因为_instance是引用类型的数据,后续 for 循环的执行会更新_instance 的内容,考虑到循环引用的问题,在deepClone方法中用到 WeakMap 类型,其中wm.set方法执行后wm中保存的数据 key === value , 该对象用于数据的记忆。