选对象拷贝策略需据场景定:纯JSON数据用JSON.parse(JSON.stringify());现代环境优先structuredClone();高性能复杂类型用fast-copy;旧环境兜底可手写WeakMap递归。

选对象拷贝策略,关键看三点:你要复制什么、运行在什么环境、性能要求有多高。不是越新越好,也不是越快越合适,得对上场景。
纯数据结构且需全环境兼容
比如从 API 拿到的配置项、表单提交的 JSON 数据,只含 null、布尔、数字、字符串、普通对象和数组——用 JSON.parse(JSON.stringify()) 最直接。
- 所有浏览器和 Node.js 版本都支持,零依赖
- 速度快、写法极简:
const copy = JSON.parse(JSON.stringify(obj)) - 但会丢掉
undefined、function、Symbol、NaN、Infinity;Date变字符串,RegExp变空对象;遇到循环引用直接报错
现代浏览器或较新 Node.js 环境(Chrome 98+ / Firefox 94+ / Safari 15.4+ / Node.js 17+)
structuredClone() 是目前最平衡的原生方案,开箱即用,无需引入任何库。
- 正确处理
Date、RegExp、Map、Set、ArrayBuffer、TypedArray、Error等内置类型 - 自动识别并安全处理循环引用
- 不支持
function、undefined、Symbol—— 这些本就不能被结构化克隆,会抛出DataCloneError
高频深拷贝 + 复杂类型全覆盖(如 Map/Set/Date/React 组件/自定义类实例)
当项目有性能敏感场景(如状态管理批量更新、大型表单实时镜像),或必须保留构造函数、原型链、包装对象(new Number)、WeakMap 等时,fast-copy 是当前最优解。
立即学习“Java免费学习笔记(深入)”;
- 比
lodash.cloneDeep快 2–5 倍,简单对象达 460 万次/秒 - 支持 Int8Array、DataView、TypeError 子类、带原型链的自定义类等 15+ 类型
- 内置循环引用检测,提供
copyStrict()保留属性描述符,createCopier()支持定制逻辑
需兼容 IE 或旧版 Node.js,又必须处理循环引用和基础类型
可采用 手写递归 + WeakMap 缓存 的兜底方案。
- 核心是用
WeakMap记录已拷贝的对象引用,避免死循环 - 需手动判断
Array、Date、RegExp、Map、Set等类型并分别处理 - 无法还原
constructor或非可枚举属性,功能不如fast-copy完整,仅建议临时过渡或特殊定制使用


















