选对象拷贝策略需看复制内容、运行环境和性能要求:纯数据用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 大师之旅:从入门到精通的终极指南











