如果后端传给前端一个很大的数,前端会怎么样,该怎么处理?(字节)
首先,我们需要知道,在es2020之前,js的数据范围是在-Math.pow(2,53)~Math.pow(2,53),都是开区间的,也就是说不包括边界值。
用Number包装类来表示就是-Number.MIN_SAFE_INTEGER~Number.MAX_SAFE_INTEGER
所以说,如果后端传给前端一个很大的数,并明确告诉你它超过了最大边界,后端不打算用fastjson中提供的注解@JSONField(serializeUsing= ToStringSerializer.class)帮你做转换!
那该怎么办?
刚才我也说了是在es2020之前不行,但我可没说之后不行吖!
es2020开始,提供了一种新的数据类型:BigInt,其实用它就可以解决,但是为了考虑兼容性,这个经过bebel转换成es5,不保证它不会出问题,所以我们还需要考虑别的方案。
第二种方法:All in String(残缺)
什么意思呢?就是咱们前端呐,不管你后端传过来的是number类型还是字符串,统统就统一成字符串!
那有的人就会说,那不只能光展示嘛,有个屁用!
诶,客官您别急,谁说字符串就不能进行算数操作了?
您想想,二进制是如何进位的?或者说我们平时做加法题的时候都在干嘛?
对喽!从末尾开始加嘛,同位超过十的部分就进位,余出部分就留下嘛,对不对。
这时候我们处理的结果还是字符串!传给后端,他又说了,后端为了安全考虑不能整这种字符串和数字的来回转换!
好么!咱再换!
第三种方法:引入库json-bigint(残缺)
与json用法一致,里面内置了对大数的特殊处理!不过咱们是用JSON.巴拉巴拉,它是jsonBig.巴拉巴拉
看到是看懂了,不过你这残缺啥意思嘛?
害,我们平时不都习惯用封装好的请求库嘛,比如fetch啦,ajax啦,axios啦。对吧!你就像axios,它里面内置了对返回数据优先进行JSON.parse处理吖,那你说你后来又是都换成字符串又是用这个库的,要么不考虑兼容性用新的数据类型的,有啥用?对吧!
不过axios很贴心就是了,允许我们去修改它,不像vant库那个索引,谁敢动源码啊!!!