本日碰到个题目:后端设置了一个 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