JSON.stringify() 和 JSON.parse() 可实现纯数据对象的深拷贝,但会丢失函数、undefined、Symbol、Date(转字符串)、RegExp(变空对象)等类型,适用于配置项等简单结构。

用 JSON.stringify() 和 JSON.parse() 可以快速实现简单对象的深拷贝,但仅适用于纯数据对象(不含函数、undefined、Symbol、Date、RegExp、Map、Set 等)。
适用场景:只含基本类型和嵌套普通对象/数组
这种方法适合配置项、表单数据、API 响应等结构清晰、无特殊类型的对象。例如:
const original = {
name: "Alice",
age: 30,
hobbies: ["reading", "coding"],
address: { city: "Beijing", zip: "100000" }
};
直接序列化再解析即可得到一份独立副本:
const copy = JSON.parse(JSON.stringify(original));
修改 copy.address.city 不会影响 original.address.city,说明已深拷贝成功。
立即学习“Java免费学习笔记(深入)”;
关键限制:哪些值会丢失或出错
JSON 格式本身不支持以下类型,序列化时会被静默处理:
- null 会被保留(正常)
- undefined、function、Symbol 会被直接忽略(对应属性消失)
-
Date 对象变成字符串(如
"2024-05-20T12:00:00.000Z",不再是 Date 实例) -
RegExp 变成空对象
{} -
NaN、Infinity 变成
null -
循环引用 会抛出
TypeError
安全使用的小技巧
若不确定数据结构,可加一层简单校验或降级处理:
- 先用
typeof或Array.isArray()判断是否为可序列化类型 - 对 Date 类型,提前转成 ISO 字符串;后续手动恢复(需额外逻辑)
- 捕获异常,避免因循环引用或非法值导致程序中断:
function safeJSONClone(obj) {
try {
return JSON.parse(JSON.stringify(obj));
} catch (e) {
console.warn("JSON clone failed:", e.message);
return null;
}
}
替代方案建议
当对象可能含复杂类型时,推荐更健壮的方式:
- 使用
structuredClone()(现代浏览器支持,能处理 Date、RegExp、Map、Set、ArrayBuffer 等) - 引入 Lodash 的
_.cloneDeep() - 手写递归拷贝(适合学习或极简定制需求)
JSON 方法简单有效,但不是万能解法——用对场景才真正省心。


















