今天遇到个问题:后端设置了一个 id=32132132132132112(数字) 在 cookie 中。
我为了偷懒,用了个第三方组件去解析 cookie,然后发现这个数字被解析出来变成了 32132132132132110
百思不得其解,这么一个简单的 cookie parse 的组件怎么会发生这么奇怪的问题。
翻了下源码发现有这么一句:JSON.parse(xxx)
。
果不其然,JSON.parse(32132132132132112)
的输出是 32132132132132110
。
很明显,这应该是溢出的问题,JS 能处理的数字都是浮点数,超出范围则会忽略了。
JS中整数的数字范围是 -2^53~2^53, 超出则视为 2^53 处理,注意这个并不会报错,所以如果你在使用巨型数字前没有意识到这个问题,意味着项目上线后,你将可能丢失用户数据。
所以遇到这种问题,要么限制数字输入在可控范围内,要么在不需要计算的时候,将这种数字串存为字符串,要么使用一些能处理巨型计算的库来解决问题,比如 https://github.com/jtobey/javascript-bignum 或 https://www.npmjs.com/package/json-bigint
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。