JSON深拷贝本质是序列化再反序列化,快且兼容性好,但仅适用于纯基本类型、普通对象/数组、无函数/undefined/Symbol/Date/RegExp/Map/Set、无循环引用的数据;含特殊类型时会静默丢失。

用 JSON.stringify() 和 JSON.parse() 处理普通数据的深拷贝,本质是“序列化再反序列化”,它不操作内存引用,而是生成一份全新的纯数据结构。这种方式快、简洁、兼容性好,但只适用于不含特殊类型的对象。
适合用 JSON 方案的普通数据特征
这类数据通常满足以下全部条件:
- 只含基本类型(string、number、boolean、null)
- 嵌套结构全是普通对象或数组(无 class 实例、无原型方法)
- 没有函数、
undefined、Symbol、Date、RegExp、Map、Set等 - 不含循环引用(比如
obj.a = obj) - 不依赖不可枚举属性或 getter/setter
典型可用场景举例
这些日常开发中高频出现的数据结构,基本都能安全使用 JSON 方法:
- API 返回的配置项:
{ theme: "dark", lang: "zh", features: ["notify", "auto-save"] } - 表单提交前的临时副本:
{ username: "tom", email: "t@x.com", preferences: { theme: "light" } } - 状态快照(如 Redux 中的简单 state):
{ user: { id: 1, name: "Alice" }, posts: [{ id: 101, title: "Hello" }] }
一行代码实现并验证是否生效
直接调用即可,无需额外封装:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
const original = { a: 1, b: { c: 2, d: [3, 4] } };
const copy = JSON.parse(JSON.stringify(original));
copy.b.c = 999;
console.log(original.b.c); // 2 → 未被修改
console.log(copy.b.c); // 999 → 修改仅作用于副本
只要输出符合预期,说明深拷贝已成功,嵌套层级完全隔离。
需要警惕的静默丢失情况
一旦原始数据含以下内容,JSON 方法会悄悄“丢掉”它们,不报错也不提示:
-
function:整个键值对消失(如{ name: "A", say() {} }→{ name: "A" }) -
undefined:对应字段被剔除({ x: undefined, y: 1 }→{ y: 1 }) -
Date:变成 ISO 字符串(new Date("2023-01-01")→"2023-01-01T00:00:00.000Z") -
NaN、Infinity:转为null -
RegExp:变成空对象{}

















