news 2026/5/2 16:53:36

JavaScript中处理深拷贝中的循环引用与特殊类型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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智能问答助手,随时帮你智能搜索、高效阅读、识图理解、和你畅聊感兴趣的话题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 6:07:39

QGroundControl 4.0地面站新手入门:从零开始规划你的第一次无人机任务

QGroundControl 4.0地面站新手入门:从零开始规划你的第一次无人机任务 第一次接触无人机地面站软件时,那种既兴奋又忐忑的心情我至今记忆犹新。QGroundControl作为开源无人机生态中最受欢迎的地面控制站之一,其4.0版本在用户体验和功能完整性…

作者头像 李华
网站建设 2026/4/10 19:27:00

臻识车牌识别相机时间与管理工具

温馨提示:文末有联系方式功能定位:精准管控生命周期 臻识车牌识别相机时间与管理工具,核心聚焦于设备使用周期的智能约束与安全加固,确保软硬件协同运行始终处于可控状态。欠款防控机制:按需设定有效使用期限 系统支持…

作者头像 李华
网站建设 2026/4/12 6:07:07

双指针,数组去重

一、核心原理慢指针(i):指向去重后新数组的最后一个有效位置。快指针(j):遍历整个原数组,寻找新的不重复元素。规则:找到不重复元素 → 赋值给慢指针的下一位,慢指针前进…

作者头像 李华