国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

項(xiàng)目中JavaScript 中最大的安全整數(shù)

894974231 / 2650人閱讀

摘要:什么是最大安全整數(shù)是一個(gè)值為的常量。因?yàn)榈臄?shù)字存儲(chǔ)使用了中規(guī)定的雙精度浮點(diǎn)數(shù)數(shù)據(jù)類型,而這一數(shù)據(jù)類型能夠安全存儲(chǔ)到之間的數(shù)值包含邊界值。

什么是最大安全整數(shù)?
MAX_SAFE_INTEGER 是一個(gè)值為 9007199254740991的常量。因?yàn)镴avascript的數(shù)字存儲(chǔ)使用了IEEE 754中規(guī)定的雙精度浮點(diǎn)數(shù)數(shù)據(jù)類型,而這一數(shù)據(jù)類型能夠安全存儲(chǔ) -(253 - 1) 到 253 - 1 之間的數(shù)值(包含邊界值)。--- MDN WEB DOCS
在項(xiàng)目會(huì)導(dǎo)致什么錯(cuò)誤?

在代碼中輸出比MAX_SAFE_INTEGER大的Number值

console.log(9007199254740999) // 9007199254741000
console.log(9007199254740993) // 9007199254740992

在代碼中比較超出安全存儲(chǔ)的數(shù)值,可能會(huì)存在下列情況

9007199254740993 === 9007199254740992 // true
實(shí)際項(xiàng)目中碰到的問(wèn)題

在進(jìn)行vue 項(xiàng)目開發(fā)的時(shí)候,通過(guò)axios進(jìn)行前后端數(shù)據(jù)交互

后端在定義某些數(shù)據(jù)時(shí)將數(shù)據(jù)的ID 設(shè)置為比MAX_SAFE_INTEGER大的int類型

而我取到后也沒有注意到這一情況,在修改某一條數(shù)據(jù)時(shí),是通過(guò)傳回?cái)?shù)據(jù)ID進(jìn)行數(shù)據(jù)定位的。

然后問(wèn)題就出現(xiàn)了。。。。

數(shù)據(jù)死活修改不了,后端返回?zé)o這條數(shù)據(jù),調(diào)試了半天,

然后通過(guò)對(duì)比preview 和 response 中的數(shù)據(jù)發(fā)現(xiàn)了兩者數(shù)據(jù)不一致

如何解決?

第一個(gè)想法是在axios的攔截器中做處理,將數(shù)字類型轉(zhuǎn)換為字符串

9007199254740993  => "9007199254740993"

但經(jīng)過(guò)嘗試后發(fā)現(xiàn)axios攔截器中的數(shù)據(jù)本身就是錯(cuò)誤了。

然后就用了原生的fetch 做處理

export function getData(data) {
  const promise = new Promise(function (resolve, reject) {
    const headers = new Headers()
    headers.append("Content-Type", "application/json")
    const config = { method: "POST", headers, body: JSON.stringify(data) }
    fetch("api/url", config).then(res => res.text()).then(text => {
      function numberToString (match) {
        return `:"${match.substring(1, match.length - 1)}",`
      }
      const responseJson = JSON.parse(text.replace(/:d{15,100},/g, numberToString))
      resolve(responseJson)
    })
  })
  return promise
}

但問(wèn)題是這個(gè)只解決了一個(gè)api 的問(wèn)題,然后每個(gè)都這樣寫,太煩了。
而且fetch 并沒有axios中的攔截器,不能統(tǒng)一處理異常

所有便想要自己封裝一個(gè)fetch通過(guò)模仿axios 那樣設(shè)置攔截器之類的功能。。。。。。

然后就沒有然后了,感覺封裝一個(gè)目前需要的fetch會(huì)花個(gè)半天到一天的時(shí)間。
而且又快下班了,所以就去看axios文檔了。
發(fā)現(xiàn)axios文檔中已經(jīng)有這樣一個(gè)回調(diào)函數(shù),能解決這個(gè)問(wèn)題

 // `transformResponse` allows changes to the response data to be made before
  // it is passed to then/catch
  transformResponse: [function (data) {
    // Do whatever you want to transform the data

    return data;
  }],

這個(gè)不看文檔的壞習(xí)慣,浪費(fèi)了大半天時(shí)間

最后代碼

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // api 的 base_url
  timeout: 5*1000, // request timeout
  transformResponse: [function (data) {
    function numberToString (match) {
      return `:"${match.substring(1, match.length - 1)}",`
    }
    if (isJSON(data)) {
      const responseJson = JSON.parse(data.replace(/:d{15,100},/g, numberToString))
      return responseJson
    } else {
      return data
    }
  }]
})
總結(jié)

第一,我這個(gè)數(shù)據(jù)是json類型的的所以在取到原始數(shù)據(jù)就是字符串,其實(shí)是對(duì)字符串進(jìn)行處理

第二,最后的方案不是最優(yōu)的,應(yīng)為這個(gè)會(huì)處理每一條數(shù)據(jù),不管那條數(shù)據(jù)中有沒有超出范圍的數(shù)字

第三,能想到的比較好的方案是和后端對(duì)接時(shí)問(wèn)清楚那些是超出的,然后將這兩種情況區(qū)分開來(lái),再使用不同的axios 封裝

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/109893.html

相關(guān)文章

  • JS如何理解浮點(diǎn)數(shù)?

    摘要:本文通過(guò)介紹的二進(jìn)制存儲(chǔ)標(biāo)準(zhǔn)來(lái)理解浮點(diǎn)數(shù)運(yùn)算精度問(wèn)題,和理解對(duì)象的等屬性值是如何取值的,最后介紹了一些常用的浮點(diǎn)數(shù)精度運(yùn)算解決方案。浮點(diǎn)數(shù)精度運(yùn)算解決方案關(guān)于浮點(diǎn)數(shù)運(yùn)算精度丟失的問(wèn)題,不同場(chǎng)景可以有不同的解決方案。 本文由云+社區(qū)發(fā)表 相信大家在平常的 JavaScript 開發(fā)中,都有遇到過(guò)浮點(diǎn)數(shù)運(yùn)算精度誤差的問(wèn)題,比如 console.log(0.1+0.2===0.3)// fa...

    bang590 評(píng)論0 收藏0
  • 你不知道JavaScript卷 第一、二章

    摘要:表達(dá)式?jīng)]有返回值,因此返回結(jié)果是。并不改變表達(dá)式的結(jié)果,只要讓表達(dá)式不返回值按慣例我們用來(lái)獲得這主要源自語(yǔ)言,當(dāng)然使用或其他表達(dá)式也是可以的。不是數(shù)字的數(shù)字如果數(shù)學(xué)運(yùn)算的操作數(shù)不是數(shù)字類型,就無(wú)法返回一個(gè)有效的數(shù)字,這種情況下返回值為。 這里的內(nèi)容是讀書筆記,僅供自己學(xué)習(xí)所用,有欠缺的地方歡迎留言提示。 第一部分 類型和語(yǔ)法 第1章 類型ECMAScript語(yǔ)言類型包括Undefin...

    levy9527 評(píng)論0 收藏0
  • 探尋 JavaScript 精度問(wèn)題以及解決方案

    摘要:推導(dǎo)為何等于在中所有數(shù)值都以標(biāo)準(zhǔn)的雙精度浮點(diǎn)數(shù)進(jìn)行存儲(chǔ)的。先來(lái)了解下標(biāo)準(zhǔn)下的雙精度浮點(diǎn)數(shù)。精度位總共是,因?yàn)橛每茖W(xué)計(jì)數(shù)法表示,所以首位固定的就沒有占用空間。驗(yàn)證完成的最大安全數(shù)是如何來(lái)的根據(jù)雙精度浮點(diǎn)數(shù)的構(gòu)成,精度位數(shù)是。 閱讀完本文可以了解到 0.1 + 0.2 為什么等于 0.30000000000000004 以及 JavaScript 中最大安全數(shù)是如何來(lái)的。 十進(jìn)制小數(shù)轉(zhuǎn)為二...

    YanceyOfficial 評(píng)論0 收藏0
  • 【重溫基礎(chǔ)】6.數(shù)字

    摘要:本文是重溫基礎(chǔ)系列文章的第六篇。以指定的精度返回該數(shù)值對(duì)象的字符串表示,可接收一個(gè)參數(shù),用來(lái)指定有效數(shù)個(gè)數(shù)的整數(shù)。 本文是 重溫基礎(chǔ) 系列文章的第六篇。今日感受:自己需要多總結(jié),會(huì)有不同收獲(比如今晚我做的轉(zhuǎn)正總結(jié))。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】1.語(yǔ)法和數(shù)據(jù)類型 【重溫基礎(chǔ)】2.流程控制和錯(cuò)誤處理 【重溫基礎(chǔ)】3.循環(huán)和...

    terro 評(píng)論0 收藏0
  • 一個(gè)函數(shù)讓你看懂 'Why 0.1+0.2!=0.3'

    摘要:的二進(jìn)制科學(xué)計(jì)數(shù)法第位是,所以就有了下面的結(jié)果有著同樣的問(wèn)題,其實(shí)正是由于這樣的存儲(chǔ),在這里有了精度丟失,導(dǎo)致了。最大安全數(shù)字中表示最大安全數(shù)字計(jì)算結(jié)果是,即在這個(gè)數(shù)范圍內(nèi)不會(huì)出現(xiàn)精度丟失小數(shù)除外這個(gè)數(shù)實(shí)際上是。是一個(gè)任意精度的整數(shù)。 話不多說(shuō),先上代碼 function judgeFloat(n, m) { const binaryN = n.toString(2...

    mushang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<