JSON.parse(JSON.stringify())适用于仅含对象、数组、字符串、数字、布尔值和null的纯数据结构,但对Date、RegExp、undefined、function、Symbol、Map、Set、BigInt、TypedArray及循环引用会失效或丢失数据。

JSON.parse(JSON.stringify()) 能快速深拷贝纯数据结构,但对复杂嵌套对象和数组有明显局限——它不是万能解法,而是特定场景下的权宜之计。
哪些情况它能用
适用于只含以下内容的嵌套结构:普通对象、数组、字符串、数字、布尔值、null。比如:
let data = { user: { name: "Alice", scores: [92, 87] }, tags: ["js", "deep"] };这种结构用 JSON.parse(JSON.stringify(data)) 是安全且高效的。
哪些情况它会失效
一旦嵌套中出现以下任一类型,JSON 方法就会出错或丢数据:
立即学习“Java免费学习笔记(深入)”;
- Date 对象 → 变成 ISO 字符串,再解析成字符串,不再是 Date 实例
- RegExp 对象 → 变成空对象
{} - undefined、function、Symbol → 直接被忽略(键名消失)
- Map、Set、BigInt、TypedArray → 序列化失败或结果不可用
- 循环引用 → 报错
TypeError: Converting circular structure to JSON
替代方案推荐
遇到上述复杂类型时,优先考虑更健壮的方案:
- structuredClone():现代浏览器原生支持(Chrome 98+、Firefox 94+、Safari 15.4+),能正确处理 Date、RegExp、Map、Set、ArrayBuffer 等,也支持循环引用
- lodash.cloneDeep():兼容性最好,覆盖所有边界情况(包括函数、Symbol、自定义类),适合需要支持旧环境的项目
- 手写递归深拷贝:仅建议用于教学或极简可控场景;实际项目中易漏类型判断、循环引用检测等细节,维护成本高
怎么选才合适
判断依据不是“多复杂”,而是“有什么类型”和“跑在什么环境”:
- 纯配置数据 + 不需兼容旧浏览器 → structuredClone() 最轻量可靠
- 含函数/Symbol/自定义构造器 + 需全平台支持 → lodash.cloneDeep 是稳妥选择
- 临时调试或内部工具脚本 + 确保无特殊类型 → JSON 方案仍可快速上手


















