1

今天遇到个问题:后端设置了一个 id=32132132132132112(数字) 在 cookie 中。

我为了偷懒,用了个第三方组件去解析 cookie,然后发现这个数字被解析出来变成了 32132132132132110

百思不得其解,这么一个简单的 cookie parse 的组件怎么会发生这么奇怪的问题。

翻了下源码发现有这么一句:JSON.parse(xxx)
果不其然,JSON.parse(32132132132132112) 的输出是 32132132132132110

很明显,这应该是溢出的问题,JS 能处理的数字都是浮点数,超出范围则会忽略了。

JS中整数的数字范围是 -2^53~2^53, 超出则视为 2^53 处理,注意这个并不会报错,所以如果你在使用巨型数字前没有意识到这个问题,意味着项目上线后,你将可能丢失用户数据。

clipboard.png

所以遇到这种问题,要么限制数字输入在可控范围内,要么在不需要计算的时候,将这种数字串存为字符串,要么使用一些能处理巨型计算的库来解决问题,比如 https://github.com/jtobey/javascript-bignumhttps://www.npmjs.com/package/json-bigint

参考资料:https://www.irt.org/script/1031.htm


赖小赖小赖
1.1k 声望40 粉丝

笨鸟。