JSON.parse(JSON.stringify(obj))可安全用于纯数据对象的深拷贝,即仅含字符串、数字、布尔值、null、普通对象和数组,且无函数、undefined、Symbol、Date、RegExp、循环引用等;否则会丢失属性或报错。

直接用 JSON.parse(JSON.stringify(obj)) 就能实现简单对象的深拷贝,它本质是“转成字符串再还原”,切断了引用关系,适合纯数据结构。
什么对象能安全拷贝
必须同时满足以下条件:
- 只含字符串、数字、布尔值、
null - 嵌套结构仅限普通对象和数组(不能是
Date、RegExp、Map、Set) - 没有函数、
undefined、Symbol、NaN、Infinity - 不存在循环引用(比如
obj.self = obj) - 所有属性都是可枚举的(不可枚举属性会被跳过)
怎么写才有效
一行代码即可,无需封装:
const copy = JSON.parse(JSON.stringify(original));
例如:
const original = { name: "Tom", scores: [85, 92], info: { city: "Shanghai" } };const copy = JSON.parse(JSON.stringify(original));
之后修改 copy.info.city 或 copy.scores.push(99),不会影响 original。
哪些值会出问题
JSON 格式不支持这些类型,序列化时会静默丢失或变形:
- 函数:整个方法被忽略,拷贝后不存在
-
undefined:对应属性直接消失({ a: 1, b: undefined }→{ a: 1 }) -
Date:变成 ISO 字符串(new Date("2026-08-13")→"2026-08-13T00:00:00.000Z"),不再是Date实例 -
RegExp:变成空对象{} - 循环引用:直接抛错
TypeError: Converting circular structure to JSON
什么场景可以放心用
适合轻量、确定结构干净的数据操作:
- 表单提交前备份初始值(只要不含方法或日期实例)
- 复制配置项(如主题色、布局参数等静态对象)
- 缓存 API 响应数据(后端返回的纯 JSON 结构)
- 做状态快照用于对比或撤销(前提是数据中不含特殊类型)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











