新聞中心
BigInt 是什么?
概念
我們知道 JavaScript 中 Number 類型最大的數(shù)值為 2^53- 1,也就是 Number.MAX_SAFE_INTEGER。

成都創(chuàng)新互聯(lián)公司始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營理念,通過多達(dá)十載累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的全網(wǎng)整合營銷推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:成都OPP膠袋等企業(yè),備受客戶表揚(yáng)。
BigInt 是一種內(nèi)置對象,它提供了一種方法來表示大于 2^53 - 1 的整數(shù)。也就是說,BigInt 可以表示任意大的整數(shù)。
聲明
可以在一個(gè)整數(shù)字面量后面加上 n 或者調(diào)用函數(shù) BigInt() 定義一個(gè) BigInt。如下:
const theBiggestInt = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
// ? 9007199254740991n
類型檢測
typeof 檢測 BigInt 對象返回 bigint 字符串。
typeof 1n === 'bigint'; // truetypeof BigInt('1') === 'bigint'; // true
BigInt 基礎(chǔ)語法和注意點(diǎn)
BigInt 很多時(shí)候表現(xiàn)跟 Number 類型很像,但也有很多不同的點(diǎn),這些點(diǎn)在用到 BigInt 類型的時(shí)候,需要思考以下的點(diǎn):
運(yùn)算:
|
語法點(diǎn) |
支持度 |
備注 |
|
+、*、-、**、% |
支持 |
|
|
/ |
不支持 |
會(huì)進(jìn)行向下取整 |
|
單目 (+) 運(yùn)算符 |
不支持 |
|
|
>>>(無符號右移) |
不支持 |
因?yàn)?BigInt 都是有符號的 |
|
位運(yùn)算(除了無符號右移) |
支持 |
|
|
Math 對象方法 |
不支持 |
說明:
- 除法的時(shí)候,當(dāng)使用 BigInt 時(shí),帶小數(shù)的運(yùn)算會(huì)被取整
const expected = 4n / 2n;
// ? 2n
const rounded = 5n / 2n;
// ? 2n, not 2.5n
- 與 Number 混合運(yùn)算的話。必須轉(zhuǎn)換成同一種類型,有時(shí)候會(huì)造成精度丟失的問題,所以不建議這么使用
- 在對象中使用 BigInt 的時(shí)候,假如使用 JSON.stringify() 會(huì)發(fā)生類型錯(cuò)誤(TypeError)
綜上所述,可以看到 BigInt 的使用需要注意的點(diǎn)還是非常多的,并且在和 Number 類型轉(zhuǎn)換的時(shí)候還會(huì)發(fā)生精度丟失問題,因而建議僅在值可能大于2^53 時(shí)使用 BigInt 類型。
那么 BigInt 現(xiàn)在有哪些應(yīng)用場景呢?
BigInt 的應(yīng)用場景
高精度時(shí)間戳
大于 2^53 - 1 的整數(shù)的一個(gè)應(yīng)用場景就是高精度時(shí)間戳。精確到納秒級別的時(shí)間戳很常見,經(jīng)常用來記錄特定程序的執(zhí)行事件,以便進(jìn)行性能分析,BigInt 可以表示高精度時(shí)間戳,在后端性能分析、性能調(diào)優(yōu)中發(fā)揮作用。
大整數(shù) ID
比如 Twitter 的 id 生成服務(wù),當(dāng) id 持續(xù)增長時(shí),就會(huì)超出 JS 的安全范圍,因此要求同時(shí)冗余地返回字符串型的 id。假如有 BigInt 類型就可以直接使用。
兼容性 & PolyFill
can i use[1] 中的數(shù)據(jù)顯示,Chrome 的支持度會(huì)好很多,IE 全軍覆沒,整體覆蓋 92.25% 的用戶。
現(xiàn)在可以使用 JSBI — pure-JavaScript BigInts[2] 這個(gè)庫來實(shí)現(xiàn) BigInt。JSBI 是直接使用了 V8 和 Chrome 中 BigInt 的設(shè)計(jì)和實(shí)現(xiàn)方式,功能與瀏覽器中一致,語法稍有不同。假如 BigInt 被所有的瀏覽器原生支持后,可以使用 babel 插件 babel-plugin-transform-jsbi-to-bigint[3] 移除 JSBI 轉(zhuǎn)為原生的 BigInt 語法。
總結(jié)
總體而言,BigInt 可以表示任意大的整數(shù),目前的使用場景是相對較少的。BigInt 的使用需要注意的點(diǎn)還是非常多的,因而建議僅在值可能大于2^53 時(shí)使用 BigInt 類型。目前的兼容性一般,可以考慮使用 jsbi 這個(gè)庫替代。
參考
JSBI — pure-JavaScript BigInts[4]
BigInt-MDN[5]
參考資料
[1]can i use: https://caniuse.com/?search=bigint
[2]JSBI — pure-JavaScript BigInts: https://github.com/GoogleChromeLabs/jsbi
[3]babel-plugin-transform-jsbi-to-bigint: https://github.com/GoogleChromeLabs/babel-plugin-transform-jsbi-to-bigint
[4]JSBI — pure-JavaScript BigInts: https://github.com/GoogleChromeLabs/jsbi
[5]BigInt-MDN: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/BigInt
分享文章:面試官:聊聊BigInt?
標(biāo)題鏈接:http://fisionsoft.com.cn/article/coisoii.html


咨詢
建站咨詢
