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

用 JSON.stringify() 和 JSON.parse() 处理简单嵌套对象的深拷贝,本质是“转字符串再还原”,能快速切断引用关系,但只适用于纯数据结构。
适用对象长什么样
这类对象必须满足以下全部条件:
- 只包含基本类型(string、number、boolean、null)
- 嵌套结构仅限普通对象和数组(不含 Date、RegExp、Map、Set)
- 没有函数、undefined、Symbol、NaN、Infinity
- 不存在循环引用(比如
obj.self = obj) - 所有属性都是可枚举的(不可枚举属性会被忽略)
怎么写才安全有效
直接一行调用即可,无需额外封装:
const original = { name: "Tom", scores: [85, 92], info: { city: "Shanghai", grade: "A" } };
const copy = JSON.parse(JSON.stringify(original));
之后修改 copy.info.city 或 copy.scores.push(99),不会影响 original 的对应字段。
立即学习“Java免费学习笔记(深入)”;
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
注意:如果原始对象里有 undefined 字段,它会在序列化时被自动剔除;Date 实例会变成 ISO 字符串,比如 new Date("2026-07-28") → "2026-07-28T00:00:00.000Z"。
常见踩坑点提醒
这些情况会出错或静默丢失数据:
- 对象含方法:
{ say() { return "hi"; } }→ 拷贝后该方法消失 - 含
undefined:{ a: 1, b: undefined }→ 拷贝结果只有{ a: 1 } - 含正则:
{ pattern: /abc/g }→ 拷贝后pattern变成空对象{} - 含循环引用:
const obj = {}; obj.ref = obj;→ 运行时报错TypeError: Converting circular structure to JSON
什么场景下可以放心用
适合轻量、可控的数据操作:
- 表单提交前临时备份原始值
- 配置项复制(如主题色、布局参数等静态结构)
- API 响应数据的本地缓存副本
- 状态快照用于对比或撤销(前提是数据干净)
只要确认数据不越界,这个方法又快又稳,浏览器原生支持,无需引入依赖。

















