json.stringify()与json.parse()组合可实现纯数据对象的深拷贝,但不支持函数、undefined、symbol、date等类型,适用于json安全的简单结构。

JavaScript 中利用 JSON.stringify() 和 JSON.parse() 组合可以实现一种简单、快速的深拷贝,但仅适用于纯数据对象(即只包含字符串、数字、布尔值、null、数组和普通对象),不支持函数、undefined、Symbol、Date、RegExp、Map、Set、BigInt 等类型。
适用场景:基础数据结构的浅层“伪深拷贝”
当目标对象是 JSON 安全的(JSON-safe)——也就是能被完整序列化再还原——这种方式最直接:
- 对象/数组中不含方法、原型链、循环引用
- 所有键名是字符串,值是基本类型或嵌套的对象/数组
- 没有
undefined或function字段(它们会在stringify时被忽略)
基本写法
一行即可完成:
const deepCopy = obj => JSON.parse(JSON.stringify(obj));
例如:
const original = { a: 1, b: [2, 3], c: { d: 4 } };
const copy = JSON.parse(JSON.stringify(original));
copy.c.d = 99;
console.log(original.c.d); // 4(未被修改)
console.log(copy.c.d); // 99
常见陷阱与限制
务必注意以下情况会导致结果异常或报错:
-
Date 对象:会被转成字符串(如
"2023-01-01T00:00:00.000Z"),不再是 Date 实例 -
正则表达式:序列化后变成空对象
{} -
undefined / function / Symbol:在
stringify阶段被直接丢弃 -
循环引用:会抛出
TypeError: Converting circular structure to JSON - Map / Set / ArrayBuffer / Blob:无法被 JSON 表示,会丢失或报错
进阶:用 replacer + reviver 做轻量定制
如果需要保留部分特殊类型(比如 Date),可借助 JSON.stringify 的 replacer 和 JSON.parse 的 reviver 参数做简单映射:
function deepCopyWithDate(obj) {
const json = JSON.stringify(obj, (key, value) => {
if (value instanceof Date) return { $date: value.toISOString() };
return value;
});
return JSON.parse(json, (key, value) => {
if (value && typeof value === 'object' && value.$date) {
return new Date(value.$date);
}
return value;
});
}
这种写法仍不通用,但比裸用 JSON.parse(JSON.stringify()) 更可控。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











