JavaScript中处理深拷贝中的循环引用与特殊类型
JavaScript深拷贝需解决循环引用和特殊类型处理两大问题用WeakMap检测循环引用对Date、RegExp、Map、Set等特殊类型显式构造并通过getPrototypeOf、getOwnPropertyDescriptors等API还原原型链与不可枚举属性。JavaScript深拷贝遇到循环引用会直接报错特殊类型如Date、RegExp、Map、Set、Function等若不单独处理拷贝结果往往失真或丢失。解决这两个问题需要自定义逻辑不能只靠JSON.parse(JSON.stringify())或简单递归。检测并跳过循环引用核心思路是记录已遍历过的对象及其对应的新对象在递归过程中查表若当前对象已被处理过就直接返回对应的新对象避免无限递归。用WeakMap存储原始对象 → 拷贝后对象的映射WeakMap适合避免内存泄漏 每次进入对象前先查表命中则返回缓存结果 未命中则新建对象立即存入WeakMap再递归处理属性逐类识别与构造特殊类型Object和Array只是基础Date、RegExp、Map、Set、TypedArray、Error、Promise等都有独立的构造方式和内部属性需显式判断并还原。Date用new Date(obj.getTime())或new Date(obj.toString()) RegExp用new RegExp(obj.source, obj.flags)注意global/unicode等标志 Map/Set新建实例遍历obj.entries()或obj.values()逐项拷贝键值 TypedArray用obj.constructor.from(obj)或new obj.constructor(obj) Function通常不拷贝保留原引用若需“复制”只能字符串化eval不推荐或明确业务场景处理保持原型链与不可枚举属性单纯用Object.assign或展开运算符会丢失原型和不可枚举属性如Object.defineProperty定义的。可靠做法是 跃问 跃问是由阶跃星辰开发的免费AI智能问答助手随时帮你智能搜索、高效阅读、识图理解、和你畅聊感兴趣的话题。