一文詳細(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)置對(duì)象,不是一種特殊的數(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
對(duì)于除法運(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 對(duì)象中的大多數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
HTML+CSS+JS實(shí)現(xiàn)的簡單應(yīng)用小案例分享
這篇文章主要為大家分享四個(gè)用HTML+CSS+JS實(shí)現(xiàn)的簡單應(yīng)用小案例,有:猜數(shù)字、表白墻、切換日夜間模式和待辦事項(xiàng),需要的可以參考一下2022-02-02laypage+SpringMVC實(shí)現(xiàn)后端分頁
這篇文章主要為大家詳細(xì)介紹了laypage+SpringMVC實(shí)現(xiàn)后端分頁,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07通過學(xué)習(xí)bootstrop導(dǎo)航條學(xué)會(huì)修改bootstrop顏色基調(diào)
這篇文章主要介紹了通過學(xué)習(xí)bootstrop導(dǎo)航條學(xué)會(huì)修改bootstrop顏色基調(diào),需要的朋友可以參考下2017-06-06淺談監(jiān)聽單選框radio改變事件(和layui中單選按鈕改變事件)
今天小編就為大家分享一篇淺談監(jiān)聽單選框radio改變事件(和layui中單選按鈕改變事件),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09JS插件amCharts實(shí)現(xiàn)繪制柱形圖默認(rèn)顯示數(shù)值功能示例
這篇文章主要介紹了JS插件amCharts實(shí)現(xiàn)繪制柱形圖默認(rèn)顯示數(shù)值功能,結(jié)合實(shí)例形式分析了amCharts插件繪制柱形圖并顯示數(shù)值的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11微信小程序多表聯(lián)合查詢的實(shí)現(xiàn)詳解
小程序設(shè)計(jì)中,通常會(huì)根據(jù)業(yè)務(wù)來做多表的拆分,多表拆分一般是根據(jù)業(yè)務(wù)的特點(diǎn)進(jìn)行拆分。比如我們?cè)谖恼玛P(guān)注的業(yè)務(wù)中,會(huì)將文章和關(guān)注信息拆分成一對(duì)多的表關(guān)系。初學(xué)者可能對(duì)一對(duì)一、一對(duì)多、多對(duì)多的設(shè)計(jì)概念不是特別清楚2022-08-08簡單談?wù)刯avascript中的變量、作用域和內(nèi)存問題
這篇文章主要介紹了簡單談?wù)刯avascript中的變量、作用域和內(nèi)存問題的相關(guān)資料,需要的朋友可以參考下2015-08-08