JSON.parse(JSON.stringify(obj)) 是最简捷的纯数据对象深拷贝方式,但仅适用于可 JSON 序列化的值(字符串、数字、布尔、null、普通数组和嵌套对象),不支持函数、undefined、Symbol、Date、RegExp、Map、Set、BigInt 或循环引用。

用 JSON.parse(JSON.stringify(obj)) 是最简捷的纯数据对象深拷贝方式,但只适用于“可 JSON 序列化”的值——即不包含函数、undefined、Symbol、Date、RegExp、Map、Set、BigInt 或循环引用的对象。
适用场景:简单纯数据对象
当你的对象只含字符串、数字、布尔值、null、普通数组和嵌套的普通对象时,这个方法高效可靠:
- 执行快,原生支持,无需额外依赖
- 代码一行搞定,语义清晰:
const copy = JSON.parse(JSON.stringify(original)); - 自动处理任意深度的嵌套结构(只要不含非法类型)
常见失效情况要避开
以下内容在 JSON 序列化过程中会被静默丢弃或转换,导致拷贝失真:
- 函数和 undefined:直接被忽略(属性消失)
- Date 对象:变成 ISO 字符串,不再是 Date 实例
-
正则表达式:变成空对象
{} -
NaN、Infinity、-Infinity:转为
null -
循环引用:抛出
TypeError: Converting circular structure to JSON
替代方案建议(按需选择)
如果对象可能含上述类型,推荐更健壮的方式:
立即学习“Java免费学习笔记(深入)”;
- 开发环境可用
structuredClone()(现代浏览器和 Node.js 17+ 支持),能正确处理 Map、Set、Date、RegExp、ArrayBuffer 等 - 需兼容老环境时,用 Lodash 的
_.cloneDeep() - 自己实现递归拷贝前,先判断是否真需要深拷贝——有时浅拷贝或 Immutable 设计更合适
不复杂但容易忽略:用 JSON 方法前,先确认数据“够干净”。


















