昨晚在和後端聯調時發現的問題,做下記錄。
- 情況是這樣的:
需求是點擊列表後,拿列表的id去獲取詳情數據;然後一直獲取不到,接口沒報錯,參數也傳過去了。後端一頓排查,說你id是不是傳錯了,我庫裏壓根找不到這個id,我說沒錯呀,信誓旦旦打開preview給他看,喏,我獲取到的id是什麼就給你傳什麼過去的呀。等他走後,我想了想,然後偷偷拿着接口到postman去掉,果不其然:
從postman中獲取到的列表的數據如下:
{
"jylx": "XX",
"tdfwdz": "杭州市餘杭區XXX",
"lrrq": "2019-03-20",
"lybz": "XX",
"id": 1621903201412262729
}
而從chrome開發者工具中preview看到的數據如下:
{
"jylx": "XX",
"tdfwdz": "杭州市餘杭區XXX",
"lrrq": "2019-03-20",
"lybz": "XX",
"id": 1621903201412262700
}
有沒有發現哪裏不一樣?
對,id變了!那肯定拿不到數據洛。
然後讓後端把id轉成string類型,就成功拿到了數據。
- 分析原因:
數據是拿到了,可是爲什麼id會變呢?既然postman能拿到正確的數據,那說明是瀏覽器的問題。
查詢資料後瞭解到:原來是瀏覽器響應數據時,對超長的long型數據進行自動轉換而導致的精度丟失問題。
那超長是多長?有沒有一個邊界呢?
答案是:有的。
我們可以通過ES6的 Number.MAX_SAFE_INTEGER 和Number.MIN_SAFE_INTEGER獲取到上下邊界,在這個範圍內不會出現精度丟失問題。也可以直接同 Number.isSafeInteger() 來判斷一個num是否在邊界範圍內,如下圖: