1.后端把返回值的字段減少一點
2.后端把返回值轉(zhuǎn)成String類型,然后接收的時候把String類型轉(zhuǎn)回long類型
但是1有場景限定
對于1來說 項目已經(jīng)上線的話字段更改代價比較大脉课,所以需要用到2方法
但是2方法對于前端來說有時候也并不是那么的好用
盡管后端返回的是字符串因為請求返回的時候會用JSON.parse(response)來解析后端返回的字符串這個時候就涼涼了啤月,那么有辦法解決嗎?有的嫉髓,不多CC直接上方法观腊。
對接收的值作處理
const res = getRealJsonData(response.request.responseText); //直接放要解析的json字符串
function getRealJsonData(baseStr) {
if (!baseStr || typeof baseStr != 'string') return;
var jsonData = null;
try {
jsonData = JSON.parse(baseStr);
} catch (err) {
return null;
}
var needReplaceStrs = [];
loopFindArrOrObj(jsonData, needReplaceStrs);
needReplaceStrs.forEach(function (replaceInfo) {
var matchArr = baseStr.match(eval('/"' + replaceInfo.key + '":[0-9]{15,}/'));
if (matchArr) {
var str = matchArr[0];
var replaceStr = str.replace('"' + replaceInfo.key + '":', '"' + replaceInfo.key + '":"');
replaceStr += '"';
baseStr = baseStr.replace(str, replaceStr);
}
});
var returnJson = null;
try {
returnJson = JSON.parse(baseStr);
} catch (err) {
return null;
}
return returnJson;
}
遍歷數(shù)組類型
function getNeedRpStrByArr(arr, needReplaceStrs) {
for (var i = 0; i < arr.length; i++) {
var value = arr[i];
loopFindArrOrObj(value, needReplaceStrs);
}
}
遞歸遍歷
function loopFindArrOrObj(value, needRpStrArr) {
var valueTypeof = Object.prototype.toString.call(value);
if (valueTypeof == '[object Object]') {
needRpStrArr.concat(getNeedRpStrByObj(value, needRpStrArr));
}
if (valueTypeof == '[object Array]') {
needRpStrArr.concat(getNeedRpStrByArr(value, needRpStrArr));
}
}
遍歷對象類型
function getNeedRpStrByObj(obj, needReplaceStrs) {
for (var key in obj) {
var value = obj[key];
if (typeof value == 'number' && value > 9007199254740992) {
needReplaceStrs.push({
key: key
});
}
loopFindArrOrObj(value, needReplaceStrs);
}
}
瀏覽器精度測試
let num = 1616161616161616, num1 = 17171717171717171, num2 = 181818181818181818;
// 打印結(jié)果
num: 1616161616161616 // 沒有變化,還頂?shù)米?num1: 17171717171717172 // 結(jié)果好像只是+1了
num2: 181818181818181820 // 結(jié)果好像+2了
// 經(jīng)過一系列的測試在17位的時候原數(shù)值有時候會+1算行,有時候不變梧油,不知道什么情況。州邢。儡陨。18位最后一位永遠是0,倒數(shù)第二位好像沒有規(guī)律可言量淌,測試半天沒發(fā)現(xiàn)什么規(guī)律
總結(jié)
使用這個方法可以在轉(zhuǎn)義之前把精度會缺失的字符串在外面再包一層字符串 像這樣子 '"111111111111111111"'骗村,這樣子在解析的時候就能避免瀏覽器在使用JSON.parse()方法的時候把后端返回的字符串轉(zhuǎn)成Number而導(dǎo)致超出瀏覽器限制范圍(chrome是17位就開始作妖,18就補0)其他瀏覽器暫時沒測試過呀枢,歡迎各位大佬科普