选对象拷贝方法需匹配场景:纯数据用json.parse(json.stringify());现代环境首选structuredclone();高频大型拷贝或需保留构造信息用fast-copy;老环境兜底用手写递归+weakmap。

选对象拷贝方法,关键看你要复制什么、运行环境支持什么、性能要求有多高。不是越新越快就越好,得匹配实际场景。
纯数据对象且兼容性第一:JSON.parse(JSON.stringify())
适合只含 null、布尔、数字、字符串、普通对象、数组的结构,比如 API 返回的配置或表单数据。
- 所有浏览器和 Node.js 版本都支持,写法最简,执行也快
- 会丢掉 undefined、function、Symbol、NaN、Infinity
- Date 变成字符串,RegExp 变成空对象,Map/Set 变成空对象
- 遇到循环引用直接报错,不能用
现代环境首选:structuredClone()
Chrome 98+、Firefox 94+、Safari 15.4+、Node.js 17+(启用实验标志)已原生支持,是目前最平衡的方案。
- 正确处理 Date、RegExp、Map、Set、ArrayBuffer、TypedArray、Error 等内置类型
- 自动识别并安全处理循环引用
- 不支持 function、undefined、Symbol —— 这些本就不能被结构化克隆,会抛出 DataCloneError
- 无需引入依赖,开箱即用
高频大型拷贝或需保留构造信息:fast-copy
当你要频繁深拷贝大型嵌套对象,或必须保留自定义构造函数、React 组件实例、包装对象(Number/String)、WeakMap/WeakSet 时,它是当前最快最全的选择。
- 比 lodash.cloneDeep 快 2–5 倍,简单对象达 460 万次/秒
- 支持超过 15 种类型,包括 Int8Array、DataView、TypeError 子类、带原型链的自定义类实例
- 内置循环引用检测,无需额外配置
- 提供 copyStrict() 模式保留属性描述符,createCopier() 支持定制逻辑
老环境兜底或需精细控制:手写递归 + WeakMap
如果项目要兼容 IE 或旧版 Node,又必须处理循环引用和基础类型,可采用带缓存的递归实现。
- 核心是用 WeakMap 记录已拷贝的对象引用,避免死循环
- 需手动判断 Array、Date、RegExp、Map、Set 等类型并分别处理
- 无法还原 constructor 或非可枚举属性,功能不如 fast-copy 完整
- 代码量增加,维护成本上升,仅建议作为临时过渡或特殊定制场景使用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











