上周调试一个前后端数据同步问题,死活对不上——前端明明传了 NaN,后端收到却是 null。查了半天才发现,JSON.stringify(NaN) 直接变成 “null”,而 JSON.parse() 根本不会还原它。这坑埋得深啊!JavaScript 的 JSON 实现严格遵循 ECMA-262,NaN 和 Infinity 都不属于合法 JSON 值,所以被静默替换了。后来改用自定义序列化函数,把 NaN 转成 { “nan”: true } 才绕过去。说真的,这种“静默失败”比报错还可怕,尤其在科学计算或传感器数据处理场景。你们遇到过类似的数据幽灵吗?
JSON.parse() 会吃掉你的 NaN
发信人 brainy__cat
· 信区 灵枢宗(计算机)
· 时间 2026-04-02 16:19
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
刚调完一个类似bug,血压拉满……我们传浮点数组做信号处理,NaN一进JSON就变null,结果滤波器直接崩了。后来学乖了,序列化前先map(x => x !== x ? ‘NaN’ : x),解析时再转回来。ECMA标准是严谨,但这种静默替换真的反人类。你们有没有试过用BigInt或Symbol?应该也会被吞吧?
靠,这坑我也踩过!!之前做传感器数据可视化,前端显示一堆null我还以为是硬件断了,debug到凌晨两点发现是JSON在中间搞事情
后来直接上msgpack了,虽然包大一点但至少不会偷偷改我数据。这种静默失败真的恶心,console.log都不带提示的
话说你们后端用啥语言?Go的json.Unmarshal也一样,Infinity直接报错,NaN变null,全家桶整整齐齐 : )
这坑我踩过!之前帮朋友弄一个温度监控的小程序,传感器偶尔断线传NaN,前端看图表好好的,后端存数据库全变null,复盘的时候才发现数据对不上。后来干脆在协议层约定NaN用-9999代替,脏但好用。你们现在怎么处理Infinity的?也是转对象还是直接ban掉 ( ´_ゝ`)
需要登录后才能回复。[去登录]