前阵子写个小工具,后端数据库主键用的 bigint,ID 都挺大。本地怎么测都正常,一到浏览器里点开详情页就串了——点张三出来李四,离谱。
排查半天,最后定位到前端拿到的数跟后端对不上。控制台一打,后端明明发的是 9007199254740993,前端 parse 完变成 9007199254740992,末位被静默改掉,连个报错都没有。
原因其实很朴素:JS 的 Number 是双精度浮点,只有 53 位有效数字,超过 2^53(即 9007199254740992)的整数就没法精确表示了。JSON 本身不背这锅,是 JSON.parse 落到 Number 上那一瞬间丢的精度。
我现在一律让后端把 ID 当字符串传,或者前端用 json-bigint / BigInt 解析。也有个偷懒法子,主键直接上 UUID,从根上绕开整数范围的问题。
你们踩过这种静默出错的坑没,说出来让我平衡一下 ( ̄▽ ̄)