如果后端傳給前端一個很大的數(shù),前端會怎么樣,該怎么處理?(字節(jié))
首先,我們需要知道,在es2020之前,js的數(shù)據(jù)范圍是在-Math.pow(2,53)~Math.pow(2,53),都是開區(qū)間的,也就是說不包括邊界值。
用Number包裝類來表示就是-Number.MIN_SAFE_INTEGER~Number.MAX_SAFE_INTEGER
所以說,如果后端傳給前端一個很大的數(shù),并明確告訴你它超過了最大邊界,后端不打算用fastjson中提供的注解@JSONField(serializeUsing= ToStringSerializer.class)幫你做轉(zhuǎn)換!
那該怎么辦?
剛才我也說了是在es2020之前不行,但我可沒說之后不行吖!
es2020開始,提供了一種新的數(shù)據(jù)類型:BigInt,其實(shí)用它就可以解決,但是為了考慮兼容性,這個經(jīng)過bebel轉(zhuǎn)換成es5,不保證它不會出問題,所以我們還需要考慮別的方案。
第二種方法:All in String(殘缺)
什么意思呢?就是咱們前端吶,不管你后端傳過來的是number類型還是字符串,統(tǒng)統(tǒng)就統(tǒng)一成字符串!
那有的人就會說,那不只能光展示嘛,有個屁用!
誒,客官您別急,誰說字符串就不能進(jìn)行算數(shù)操作了?
您想想,二進(jìn)制是如何進(jìn)位的?或者說我們平時做加法題的時候都在干嘛?
對嘍!從末尾開始加嘛,同位超過十的部分就進(jìn)位,余出部分就留下嘛,對不對。
這時候我們處理的結(jié)果還是字符串!傳給后端,他又說了,后端為了安全考慮不能整這種字符串和數(shù)字的來回轉(zhuǎn)換!
好么!咱再換!
第三種方法:引入庫json-bigint(殘缺)
與json用法一致,里面內(nèi)置了對大數(shù)的特殊處理!不過咱們是用JSON.巴拉巴拉,它是jsonBig.巴拉巴拉
看到是看懂了,不過你這殘缺啥意思嘛?
害,我們平時不都習(xí)慣用封裝好的請求庫嘛,比如fetch啦,ajax啦,axios啦。對吧!你就像axios,它里面內(nèi)置了對返回?cái)?shù)據(jù)優(yōu)先進(jìn)行JSON.parse處理吖,那你說你后來又是都換成字符串又是用這個庫的,要么不考慮兼容性用新的數(shù)據(jù)類型的,有啥用?對吧!
不過axios很貼心就是了,允許我們?nèi)バ薷乃?,不像vant庫那個索引,誰敢動源碼?。。?!