一文詳細(xì)聊聊js新增基本類型BigInt
前言
BigInt是JavaScript中引入的一種新的基本數(shù)據(jù)類型,主要用于表示任意精度格式的整數(shù)。它可以安全地存儲(chǔ)和操作大整數(shù),即使這個(gè)數(shù)已經(jīng)超出了Number類型能夠表示的安全整數(shù)范圍。
在 JavaScript 中,普通的數(shù)字(Number 類型)是基于 IEEE 754 雙精度浮點(diǎn)數(shù)格式存儲(chǔ)的,這導(dǎo)致它們只能安全地表示 -9007199254740991(即 -(2^53 - 1))到 9007199254740991(即 2^53 - 1)之間的整數(shù)。超出這個(gè)范圍的整數(shù)在表示時(shí)可能會(huì)失去精度。因此,BigInt解決了之前Number整數(shù)溢出的問題。
它允許你表示和操作大于 2^53 - 1 的整數(shù),而且不會(huì)丟失精度。BigInt 是一種內(nèi)置對象,不是一種特殊的數(shù)字字面量語法。你可以使用 BigInt() 函數(shù)將一個(gè)整數(shù)或字符串轉(zhuǎn)換成 BigInt,或者在數(shù)字字面量后面添加 n 后綴來創(chuàng)建 BigInt。
一、BigInt特性
1.無符號(hào)與任意長度
BigInt是一種無符號(hào)整數(shù)類型,可以存儲(chǔ)任意長度的整數(shù)。它通常使用64位或128位來表示,但實(shí)際上并不受限于特定的位數(shù)。這使得BigInt能夠存儲(chǔ)比普通整數(shù)類型大得多的數(shù)字,例如超過10的100次方的數(shù)字。
2.運(yùn)算支持
BigInt支持常見的數(shù)學(xué)運(yùn)算,包括加法、減法、乘法和除法等。這些運(yùn)算可以在BigInt值之間進(jìn)行(這是重點(diǎn),不同類型運(yùn)算,會(huì)損失精度),而不會(huì)導(dǎo)致精度損失或溢出。
3.類型轉(zhuǎn)換
當(dāng)需要將BigInt與普通數(shù)字(Number類型)進(jìn)行交互時(shí),需要進(jìn)行顯式的類型轉(zhuǎn)換。這是因?yàn)锽igInt和普通數(shù)字是兩種不同類型的值,不能直接混合使用。
4.應(yīng)用場景廣泛
由于BigInt能夠處理大整數(shù),它在計(jì)算機(jī)科學(xué)中的應(yīng)用非常廣泛。例如,在密碼學(xué)中,它可以用于生成加密密鑰;在大數(shù)據(jù)分析中,它可以用于處理大量的數(shù)據(jù);在自然數(shù)值域、金額和貨幣、計(jì)數(shù)器、標(biāo)識(shí)符以及時(shí)間戳等場景中,BigInt也都有著重要的應(yīng)用,也為前端技術(shù)應(yīng)用的邊界做出了延伸貢獻(xiàn)。
二、BigInt的使用
1.創(chuàng)建 BigInt
代碼如下(示例):
const bigInt1 = BigInt("12345678901234567890"); // 使用字符串創(chuàng)建 BigInt
const bigInt2 = 12345678901234567890n; // 使用數(shù)字字面量后綴 n 創(chuàng)建 BigInt
2.BigInt 運(yùn)算
BigInt 支持加(+)、減(-)、乘(*)、除(/)、取模(%)等基本運(yùn)算,也支持位運(yùn)算(如按位與 &、按位或 |、按位異或 ^ 等):
const sum = BigInt(12345678901234567890) + BigInt(98765432109876543210); //console.log(sum) 111111111011111110656n const diff = BigInt(12345678901234567890) - BigInt(98765432109876543210); //console.log(diff) -86419753208641976320n const product = BigInt(12345678901234567890) * BigInt(98765432109876543210); //console.log(product) 1219326311370217884360920552323609001984n
對于除法運(yùn)算,需要注意的是,BigInt 的除法運(yùn)算會(huì)返回一個(gè) BigInt 類型的商,任何小數(shù)部分都會(huì)被舍棄。如果需要獲取余數(shù),你可以使用 % 運(yùn)算符。:
const sum = BigInt(12345678901234567890) + BigInt(98765432109876543210); //console.log(sum) 111111111011111110656n const diff = BigInt(12345678901234567890) - BigInt(98765432109876543210); //console.log(diff) -86419753208641976320n const product = BigInt(12345678901234567890) * BigInt(98765432109876543210); //console.log(product) 1219326311370217884360920552323609001984n
3.與普通數(shù)字的交互
BigInt 和普通數(shù)字(Number 類型)是兩種不同類型的值,因此不能直接進(jìn)行混合運(yùn)算。如果嘗試這樣做,JavaScript 會(huì)拋出一個(gè)錯(cuò)誤。你可以使用 BigInt() 或字面量后綴 n 來顯式轉(zhuǎn)換類型:
const regularNumber = 123; const bigNumber = BigInt(123); // 錯(cuò)誤的用法,會(huì)拋出 TypeError // const result = regularNumber + bigNumber; //Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions at <anonymous>:1:30 // 正確的用法,顯式轉(zhuǎn)換類型 const result = BigInt(regularNumber) + bigNumber; //console.log(result) // 246n
4.比較操作
你可以使用比較運(yùn)算符(如 >、<、==、!=、>=、<=)來比較 BigInt 值。不過,與普通數(shù)字進(jìn)行比較時(shí),至少保證一個(gè)數(shù)字是BigInt 類型:
const bigInt1 = BigInt(123); const bigInt2 = BigInt(456); const regularNumber = 789; console.log(bigInt1 < bigInt2); // true console.log(bigInt1 < BigInt(regularNumber)); // true console.log(bigInt1 < regularNumber); // true,這里理論上應(yīng)該報(bào)錯(cuò),實(shí)際不會(huì)報(bào)錯(cuò),因?yàn)槭莏s機(jī)制的隱式轉(zhuǎn)換,只限于比較
bigInt1 < regularNumber,這里理論上應(yīng)該報(bào)錯(cuò),實(shí)際不會(huì)報(bào)錯(cuò),因?yàn)閖s機(jī)制的隱式轉(zhuǎn)換(這里就不贅述了,已有太多資料可以查詢),只限于比較,小伙伴可以試驗(yàn)下,親試如此。
補(bǔ)充:使用BigInt時(shí)的注意點(diǎn)
使用大數(shù)時(shí)需要注意:
- BigInt類型不能和內(nèi)置函數(shù)Math共同使用
- BigInt不能和number類型進(jìn)行運(yùn)算, 只能和同為BigInt的數(shù)字進(jìn)行運(yùn)算
- BigInt可以和number進(jìn)行比較
- BigInt不能轉(zhuǎn)小數(shù), 只能轉(zhuǎn)整數(shù), 遇到不是數(shù)字的情況(布爾值或者[] )內(nèi)部應(yīng)該會(huì)嘗試先將其轉(zhuǎn)為數(shù)字
驗(yàn)證例子1: n1為bigint, n2為數(shù)字, 使用Math.pow()函數(shù)來求兩者的平方
const n1 = 10n;
try {
console.log(Math.pow(n1, 2));
} catch (error) {
console.log(error);
}
const n2 = 10;
console.log(Math.pow(n2, 2));
可以看到確實(shí)大數(shù)不能和math相關(guān)函數(shù)配合使用
驗(yàn)證例子2: 使用大數(shù)和number進(jìn)行運(yùn)算和比較
const n1 = 10n;
const n2 = 20;
try {
console.log(n1 + n2);
} catch (error) {
console.log(error);
}
console.log(n1 + BigInt(n2));
console.log(n1 > n2);
結(jié)果大數(shù)不能和number進(jìn)行運(yùn)算, 可以和number進(jìn)行比較
驗(yàn)證例子3: BigInt不能轉(zhuǎn)小數(shù)
try {
console.log(BigInt(22.22));
} catch (error) {
console.log(error);
}
報(bào)錯(cuò)內(nèi)容大概是不能轉(zhuǎn)換成bigint因?yàn)樗皇莻€(gè)整數(shù)
總結(jié)
1、BigInt 類型的值不能和普通數(shù)字混合使用,除非進(jìn)行顯式的類型轉(zhuǎn)換(比較是例外)。
2、BigInt 不支持一些 Number 類型的方法,如 Math 對象中的大多數(shù)函數(shù)。你需要尋找適合 BigInt 的替代方案。
3、并非所有環(huán)境都支持 BigInt。確保你的代碼運(yùn)行在支持 BigInt 的 JavaScript 引擎中。
4、BigInt 的引入使得 JavaScript 在處理大整數(shù)時(shí)更加靈活和強(qiáng)大,特別是在需要精確表示和計(jì)算大整數(shù)的場景中,如加密、科學(xué)計(jì)算等。
到此這篇關(guān)于js新增基本類型BigInt的文章就介紹到這了,更多相關(guān)js新增基本類型BigInt內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
uniapp開發(fā)App出現(xiàn)網(wǎng)絡(luò)異常的解決方法
這篇文章主要給大家介紹了uniapp開發(fā)App出現(xiàn)網(wǎng)絡(luò)異常的解決方案,文中有相關(guān)的解決方法和步驟,具有一定的參考價(jià)值,需要的朋友可以參考下2023-09-09
javascript Array對象基礎(chǔ)知識(shí)小結(jié)
感覺自己對Array對象總是有種朦朧的感覺,今天自己手寫總結(jié),加深一下印象。2010-11-11
淺談layer的Icon樣式以及一些常用的layer窗口使用方法
今天小編就為大家分享一篇淺談layer的Icon樣式以及一些常用的layer窗口使用方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
帝國cms首頁列表頁實(shí)現(xiàn)點(diǎn)贊功能
這篇文章主要介紹了帝國cms首頁列表頁實(shí)現(xiàn)點(diǎn)贊功能的相關(guān)資料,需要的朋友可以參考下2017-10-10
Typescript 中的 interface 和 type 到底有什么區(qū)別詳解
這篇文章主要介紹了Typescript 中的 interface 和 type 到底有什么區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
通過action傳過來的值在option獲取進(jìn)行驗(yàn)證的方法
通過action傳過來的值在option獲取進(jìn)行驗(yàn)證,下面有個(gè)不錯(cuò)的示例,需要的朋友不要錯(cuò)過2013-11-11
javascript window.confirm確認(rèn) 取消對話框?qū)崿F(xiàn)代碼小結(jié)
本文章講述的三種都是基于了javascript confirm提示確認(rèn)框的做法了,只是在不同的地方寫哦,有需要的同學(xué)可參考一下2012-10-10
微信小程序圖標(biāo)的角標(biāo)實(shí)現(xiàn)代碼
文章介紹微信小程序中實(shí)現(xiàn)圖標(biāo)角標(biāo)和可拖動(dòng)懸浮圖標(biāo)的方法,通過view控件定位樣式,提供WXML/WXSS代碼示例,感興趣的朋友跟隨小編一起看看吧2025-06-06
移動(dòng)端touch拖動(dòng)和click事件沖突問題解決
這篇文章主要為大家介紹了移動(dòng)端touch拖動(dòng)和click事件沖突問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

