JSON.parse(JSON.stringify(obj)) 会丢失 undefined,因为 JSON 标准不支持该类型:对象中 undefined 属性被完全忽略,数组中变为 null,顶层 undefined 导致 parse 报错;同时函数、Symbol、Date 等均无法正确序列化。

JSON.parse(JSON.stringify(obj)) 是一种常用但有明显局限的“伪深拷贝”方法。它能快速复制普通对象和数组,但无法正确处理 undefined、function、Symbol、BigInt、Date、RegExp、Map、Set 等类型,尤其对 undefined 会直接丢失。
为什么 undefined 在 JSON 序列化中会消失?
JSON 标准不支持 undefined 值。当调用 JSON.stringify() 时:
- 对象中键值为
undefined的属性会被**完全忽略**(不序列化); - 数组中元素为
undefined会被转为null; -
undefined作为顶层值传入时,JSON.stringify(undefined)返回undefined,紧接着JSON.parse(undefined)报错Unexpected token u in JSON at position 0。
实际表现示例
看这段代码:
const obj = {
a: 1,
b: undefined,
c: function() {},
d: [1, undefined, 3]
};
const copied = JSON.parse(JSON.stringify(obj));
console.log(copied);
// → { a: 1, d: [1, null, 3] }
// b 和 c 消失了,d 中的 undefined 变成了 null
如何检测这种缺陷?
可在拷贝前后对比关键字段是否存在或类型是否一致:
- 遍历原对象所有 ownKeys,检查目标对象是否缺失对应 key(尤其是预期为
undefined的字段); - 对数组,逐项比对
Object.is(value, undefined)是否被错误转为null; - 简单判断:
JSON.stringify(obj) === JSON.stringify(copied)若为false,说明已有信息丢失(但注意:这不能区分undefined和null)。
替代方案建议
如需真正健壮的深拷贝,应避免依赖 JSON 方法:
- 开发环境可使用 Lodash 的
_.cloneDeep(),它显式处理undefined、函数、循环引用等; - Node.js 17+ 可尝试
structuredClone()(支持undefined、Date、RegExp等,但暂不支持函数和 Symbol); - 自定义递归拷贝时,需单独判断
typeof value === 'undefined'并保留该状态。











