json标准不支持nan、infinity、-infinity和undefined,序列化时nan和infinity/-infinity转为null,undefined在对象中被忽略、数组中变null;可靠替代方案是structuredclone()或lodash.clonedeep()。

因为 JSON 标准本身不支持 NaN、Infinity、-Infinity、undefined 这些 JavaScript 特有值,它们在序列化阶段就被强制转换或直接剔除,不是实现 bug,而是规范限制。
NaN 为什么变成 null
JSON 规范只定义六种合法类型:字符串、数字、布尔、null、数组、对象。NaN 不在其中,JSON.stringify() 遇到它既不报错,也不保留原始语义,而是按标准静默替换为 null。这种“无声丢失”容易在数值校验、异常标记、边界判断中引发逻辑错误。
Infinity 和 -Infinity 同样被转成 null
和 NaN 一样,正负无穷大不属于 JSON 合法数字字面量。虽然 JavaScript 中它们是有效数值,但 JSON.stringify() 会统一将其序列化为 null,而非字符串 "Infinity" 或科学计数形式。
undefined 的处理更彻底——直接消失
undefined 在对象属性中会被整个忽略(该键值对不进入字符串),在数组中则变成 null(如 [1, undefined, 3] → [1, null, 3])。顶层 undefined 甚至会让 JSON.parse() 直接报错。这不是遗漏,而是规范明确要求跳过。
真正可靠的替代方案
若业务依赖这些特殊值的精确表示,必须脱离 JSON 流程:
- 优先使用 structuredClone()(现代环境支持 NaN、Infinity、Date、Map 等,但不支持函数和原型)
- 复杂场景选用 lodash.cloneDeep(),它能保真处理 NaN、Infinity、undefined 等
- 需要完全控制时,可手写递归克隆,对特殊值做显式判断和复制











