javascript对象拷贝无万能解法,需据对象类型、运行环境和性能需求选择:纯数据用json法,现代环境首选structuredclone(),高频大对象用fast-copy,老环境则手写递归+weakmap。

JavaScript中拷贝对象没有“万能解法”,得看你要拷什么、跑在哪、快不快够用。不同策略各守一摊,用错就踩坑。
纯数据对象:JSON.parse(JSON.stringify()) 最省事
适合配置项、API返回的简单结构(只有字符串、数字、布尔、null、数组、普通对象),一行代码搞定,所有环境都认。
- 会丢掉 undefined、function、Symbol
- Date 变成字符串,RegExp 变成空对象,Map/Set 也变空对象
- 遇到循环引用直接报错,不能用
现代环境首选:structuredClone() 原生又靠谱
Chrome 98+、Firefox 94+、Safari 15.4+、Node.js 18.12+ 默认支持。它不是“更快的JSON”,而是浏览器底层优化的结构化克隆机制。
- 正确处理 Date、RegExp、Map、Set、ArrayBuffer、TypedArray、Error
- 自动识别并安全处理 循环引用
- 不支持 function、undefined、Symbol——这不是缺陷,是规范限制,会明确抛 DataCloneError
高频大对象或特殊类型:fast-copy 性能+覆盖双强
当你要频繁深拷贝上万级嵌套对象,或者必须保留 自定义类实例、React组件、WeakMap/WeakSet、包装对象(new Number) 时,它是目前最全最快的方案。
- 比 lodash.cloneDeep 快 2–5 倍,简单对象实测达 460 万次/秒
- 支持 Int8Array、DataView、TypeError 子类等 15+ 类型
- 内置循环引用检测,copyStrict() 可保留属性描述符,createCopier() 允许定制逻辑
老环境兜底或需精细控制:手写递归 + WeakMap
兼容 IE 或 Node.js 12 以下?又必须处理循环引用和基础类型?那就得自己动手。核心是用 WeakMap 缓存已拷贝对象引用,避免死循环。
- 需手动区分 Array、Date、RegExp、Map、Set 并分别构造新实例
- 无法还原 constructor、不可枚举属性、Symbol 键
- 代码量上升,仅建议作为过渡方案或有特殊语义要求的场景
不复杂但容易忽略:选哪一种,关键不在“新不新”,而在你对象里到底有什么、跑在哪儿、性能卡不卡点。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











