JSON深拷贝仅适用于纯数据对象,要求不含函数、undefined、Symbol等不可序列化类型,否则会丢失或失真;推荐使用structuredClone()或lodash.cloneDeep()等更健壮方案。

JSON 方法本身不能保证“安全复制”,它只适合特定条件下的快速复制。真正安全的前提是:你确认对象里只有字符串、数字、布尔值、null、普通对象和数组——不含函数、undefined、Symbol、Date、RegExp、Map、Set,也没有循环引用。
JSON 深拷贝的适用边界
它本质是“序列化再反序列化”,不是真正的通用深拷贝。只要数据结构干净,就能快速得到独立副本:
- 嵌套再深也没问题,比如
{a: {b: {c: {d: 1}}}}能完整复制 - 数组嵌套对象、对象嵌套数组,都可正常处理
- 所有属性值必须可被 JSON 编码,否则会被静默丢弃或转换(如
undefined消失,Date变字符串)
常见失效场景与表现
一旦对象含以下内容,JSON 方案就会出错或失真:
- 函数:直接被忽略,对应键值消失
-
undefined:该属性整个不出现(不是变成
null) - Symbol:完全丢失
- Date 对象:转成 ISO 字符串,不再是 Date 实例
-
RegExp:变成空对象
{} -
循环引用:抛出
TypeError: Converting circular structure to JSON
加一层防护更稳妥
不建议裸用 JSON.parse(JSON.stringify(obj))。至少包个 try-catch,并做基础校验:
立即学习“Java免费学习笔记(深入)”;
- 捕获异常,避免因循环引用或不可序列化类型导致程序中断
- 对关键字段做存在性检查,比如复制后发现某个预期存在的方法没了,就得换方案
- 若业务允许,可先用
JSON.stringify(obj)测试是否成功,再解析
替代方案建议
当不确定数据结构是否干净时,优先考虑更健壮的选项:
- structuredClone():现代环境首选,支持 Date、Map、Set、循环引用,不支持函数/undefined/Symbol —— 比 JSON 更宽泛也更可靠
- lodash.cloneDeep():兼容老环境,覆盖几乎所有类型,包括函数(浅拷贝函数引用)、RegExp、Buffer 等,适合生产系统
- 手写递归 + WeakMap:需精细控制时可用,能处理自定义类、特殊构造器,但开发成本高


















