今天遇到個問題:後端設置了一個 id=32132132132132112(數字) 在 cookie 中。javascript
我爲了偷懶,用了個第三方組件去解析 cookie,而後發現這個數字被解析出來變成了 32132132132132110java
百思不得其解,這麼一個簡單的 cookie parse 的組件怎麼會發生這麼奇怪的問題。git
翻了下源碼發現有這麼一句:JSON.parse(xxx)
。
果不其然,JSON.parse(32132132132132112)
的輸出是 32132132132132110
。github
很明顯,這應該是溢出的問題,JS 能處理的數字都是浮點數,超出範圍則會忽略了。npm
JS中整數的數字範圍是 -2^53~2^53, 超出則視爲 2^53 處理,注意這個並不會報錯,因此若是你在使用巨型數字前沒有意識到這個問題,意味着項目上線後,你將可能丟失用戶數據。json
因此遇到這種問題,要麼限制數字輸入在可控範圍內,要麼在不須要計算的時候,將這種數字串存爲字符串,要麼使用一些能處理巨型計算的庫來解決問題,好比 https://github.com/jtobey/javascript-bignum 或 https://www.npmjs.com/package/json-bigint後端
參考資料:https://www.irt.org/script/1031.htmcookie