json.parse(json.stringify())不是真正深拷贝:会丢失函数/undefined/symbol,date变字符串,regexp变{},循环引用报错,且不支持bigint、nan/infinity转null等。

JSON 方法可以快速实现深拷贝,但有明显限制,只适用于纯数据对象(不含函数、undefined、Symbol、Date、RegExp 等)。
JSON.parse(JSON.stringify(obj)) 的基本用法
这是最简捷的“伪深拷贝”写法,适合临时处理简单配置、表单数据、API 响应等纯 JSON 兼容结构。
- 先用 JSON.stringify() 把对象转成字符串(过程中会自动忽略函数、undefined、Symbol 和不可枚举属性)
- 再用 JSON.parse() 把字符串还原为新对象,所有嵌套层级都变成全新引用
- 示例:const copy = JSON.parse(JSON.stringify(original));
哪些情况会失效?必须提前注意
该方法不是真正通用的深拷贝,遇到以下类型会出错或丢失信息:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Date 对象 → 被转成字符串(如 "2023-01-01T00:00:00.000Z"),不再是 Date 实例
- 正则 RegExp → 变成空对象 {}
- undefined / function / Symbol → 在 stringify 阶段被直接丢弃
- 循环引用 → 直接报错 TypeError: Converting circular structure to JSON
- Map / Set / ArrayBuffer / BigInt → 不被 JSON 支持,结果为 null 或报错
小改进:用 replacer + reviver 处理部分特殊值
如果只是想保留 Date 或简单自定义逻辑,可借助 JSON.stringify 的 replacer 和 JSON.parse 的 reviver 做轻量适配:
- replacer 中识别 Date,转为带标记的时间字符串(如 {"__date": "2023-01-01"})
- reviver 中检测该标记,重新构造 new Date()
- 注意:这仍无法解决函数、循环引用、BigInt 等问题,仅算“有限增强”
什么场景下推荐用?什么场景该换方案?
适合用 JSON 方案的场景:
- 临时克隆接口返回的 plain object 或 array(比如从 fetch 拿到的响应数据)
- 组件中需要隔离 props 数据,且确认不含复杂类型
- 做快速原型、脚手架工具、配置合并等对健壮性要求不高的环节
建议换其他方案(如 structuredClone、lodash.cloneDeep、自定义递归)的场景:
- 涉及 Date、RegExp、Map、Set、Class 实例等
- 对象存在循环引用(如父子关系树)
- 需要保留函数或私有字段(如 React 组件状态、Vuex store)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










