json.parse(json.stringify())不是真正深拷贝:会丢失函数/undefined/symbol、date变字符串、regexp/error变空对象、nan/infinity转null、循环引用直接报错。

这个写法看着省事,实际是“假深拷贝”——它根本没真正复制对象的结构和语义,只是走了一趟 JSON 文本中转,而 JSON 本身能力有限,很多 JS 原生类型压根不支持。
日期对象变字符串,丢失类型和行为
Date 实例序列化后变成 ISO 字符串(如 "2026-07-21T12:01:00.000Z"),再 parse 回来就是一个普通字符串,不再是 Date 对象,调用 .getTime() 或 .toLocaleString() 会直接报错。
- 原始值:
new Date('2026-01-01') - JSON 处理后:
"2026-01-01T00:00:00.000Z"(字符串) - 后果:无法做日期计算、格式化、时区转换
正则和错误对象直接变空对象
RegExp、Error、Map、Set、TypedArray 等内置特殊对象,在 JSON.stringify 阶段就被“扁平化”为 {},parse 后只剩一个空 plain object,所有正则标志(g、i)、匹配逻辑、堆栈信息全部清零。
-
JSON.stringify(/abc/gi)→{} -
JSON.stringify(new Error('oops'))→{} - 结果对象既不能
.test(),也不能.message取错误信息
函数和 undefined 彻底消失
JSON 标准不包含函数或未定义值。对象里的函数属性被跳过,undefined 属性被忽略,Symbol 键整个条目被剔除——不是变成 null,是彻底不见。
{ a: 1, fn: () => {}, b: undefined, [Symbol('x')]: 'y' }- 经
JSON.parse(JSON.stringify(...))后只剩{ a: 1 } - 如果业务依赖某个方法是否在副本里存在,这里会静默失败
NaN 和 Infinity 被悄悄替换成 null
这不是丢数据,是“伪装式替换”:数值型的 NaN、Infinity、-Infinity 全部转成 null,类型从 number 变成 object(null 的 typeof 是 'object'),后续做 typeof 判断或数值运算全错乱。
-
JSON.stringify({ x: NaN, y: Infinity })→{"x":null,"y":null} - 还原后
obj.x === null,不再是isNaN(obj.x) === true
循环引用当场崩溃,不给修复机会
只要对象图里存在 A → B → A 这类闭环,JSON.stringify() 就抛出 TypeError: Converting circular structure to JSON,连执行都完成不了,更别说拷贝。
- 常见于 DOM 节点、Vue/React 组件实例、手动构造的父子引用结构
- 错误发生在 stringify 阶段,不会进入 parse,整个流程中断
- 没有 fallback,也没有 warning,就是硬 crash











