一文詳細(xì)聊聊js新增基本類型BigInt
前言
BigInt是JavaScript中引入的一種新的基本數(shù)據(jù)類型,主要用于表示任意精度格式的整數(shù)。它可以安全地存儲和操作大整數(shù),即使這個數(shù)已經(jīng)超出了Number類型能夠表示的安全整數(shù)范圍。
在 JavaScript 中,普通的數(shù)字(Number 類型)是基于 IEEE 754 雙精度浮點數(shù)格式存儲的,這導(dǎo)致它們只能安全地表示 -9007199254740991(即 -(2^53 - 1))到 9007199254740991(即 2^53 - 1)之間的整數(shù)。超出這個范圍的整數(shù)在表示時可能會失去精度。因此,BigInt解決了之前Number整數(shù)溢出的問題。
它允許你表示和操作大于 2^53 - 1 的整數(shù),而且不會丟失精度。BigInt 是一種內(nèi)置對象,不是一種特殊的數(shù)字字面量語法。你可以使用 BigInt() 函數(shù)將一個整數(shù)或字符串轉(zhuǎn)換成 BigInt,或者在數(shù)字字面量后面添加 n 后綴來創(chuàng)建 BigInt。
一、BigInt特性
1.無符號與任意長度
BigInt是一種無符號整數(shù)類型,可以存儲任意長度的整數(shù)。它通常使用64位或128位來表示,但實際上并不受限于特定的位數(shù)。這使得BigInt能夠存儲比普通整數(shù)類型大得多的數(shù)字,例如超過10的100次方的數(shù)字。
2.運算支持
BigInt支持常見的數(shù)學(xué)運算,包括加法、減法、乘法和除法等。這些運算可以在BigInt值之間進行(這是重點,不同類型運算,會損失精度),而不會導(dǎo)致精度損失或溢出。
3.類型轉(zhuǎn)換
當(dāng)需要將BigInt與普通數(shù)字(Number類型)進行交互時,需要進行顯式的類型轉(zhuǎn)換。這是因為BigInt和普通數(shù)字是兩種不同類型的值,不能直接混合使用。
4.應(yīng)用場景廣泛
由于BigInt能夠處理大整數(shù),它在計算機科學(xué)中的應(yīng)用非常廣泛。例如,在密碼學(xué)中,它可以用于生成加密密鑰;在大數(shù)據(jù)分析中,它可以用于處理大量的數(shù)據(jù);在自然數(shù)值域、金額和貨幣、計數(shù)器、標(biāo)識符以及時間戳等場景中,BigInt也都有著重要的應(yīng)用,也為前端技術(shù)應(yīng)用的邊界做出了延伸貢獻。
二、BigInt的使用
1.創(chuàng)建 BigInt
代碼如下(示例):
const bigInt1 = BigInt("12345678901234567890"); // 使用字符串創(chuàng)建 BigInt const bigInt2 = 12345678901234567890n; // 使用數(shù)字字面量后綴 n 創(chuàng)建 BigInt
2.BigInt 運算
BigInt 支持加(+)、減(-)、乘(*)、除(/)、取模(%)等基本運算,也支持位運算(如按位與 &、按位或 |、按位異或 ^ 等):
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
對于除法運算,需要注意的是,BigInt 的除法運算會返回一個 BigInt 類型的商,任何小數(shù)部分都會被舍棄。如果需要獲取余數(shù),你可以使用 % 運算符。:
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 類型)是兩種不同類型的值,因此不能直接進行混合運算。如果嘗試這樣做,JavaScript 會拋出一個錯誤。你可以使用 BigInt() 或字面量后綴 n 來顯式轉(zhuǎn)換類型:
const regularNumber = 123; const bigNumber = BigInt(123); // 錯誤的用法,會拋出 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.比較操作
你可以使用比較運算符(如 >、<、==、!=、>=、<=)來比較 BigInt 值。不過,與普通數(shù)字進行比較時,至少保證一個數(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)該報錯,實際不會報錯,因為是js機制的隱式轉(zhuǎn)換,只限于比較
bigInt1 < regularNumber,這里理論上應(yīng)該報錯,實際不會報錯,因為js機制的隱式轉(zhuǎn)換(這里就不贅述了,已有太多資料可以查詢),只限于比較,小伙伴可以試驗下,親試如此。
補充:使用BigInt時的注意點
使用大數(shù)時需要注意:
- BigInt類型不能和內(nèi)置函數(shù)Math共同使用
- BigInt不能和number類型進行運算, 只能和同為BigInt的數(shù)字進行運算
- BigInt可以和number進行比較
- BigInt不能轉(zhuǎn)小數(shù), 只能轉(zhuǎn)整數(shù), 遇到不是數(shù)字的情況(布爾值或者[] )內(nèi)部應(yīng)該會嘗試先將其轉(zhuǎn)為數(shù)字
驗證例子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ù)不能和math相關(guān)函數(shù)配合使用
驗證例子2: 使用大數(shù)和number進行運算和比較
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進行運算, 可以和number進行比較
驗證例子3: BigInt不能轉(zhuǎn)小數(shù)
try { console.log(BigInt(22.22)); } catch (error) { console.log(error); }
報錯內(nèi)容大概是不能轉(zhuǎn)換成bigint因為他不是個整數(shù)
總結(jié)
1、BigInt 類型的值不能和普通數(shù)字混合使用,除非進行顯式的類型轉(zhuǎn)換(比較是例外)。
2、BigInt 不支持一些 Number 類型的方法,如 Math 對象中的大多數(shù)函數(shù)。你需要尋找適合 BigInt 的替代方案。
3、并非所有環(huán)境都支持 BigInt。確保你的代碼運行在支持 BigInt 的 JavaScript 引擎中。
4、BigInt 的引入使得 JavaScript 在處理大整數(shù)時更加靈活和強大,特別是在需要精確表示和計算大整數(shù)的場景中,如加密、科學(xué)計算等。
到此這篇關(guān)于js新增基本類型BigInt的文章就介紹到這了,更多相關(guān)js新增基本類型BigInt內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
HTML+CSS+JS實現(xiàn)的簡單應(yīng)用小案例分享
這篇文章主要為大家分享四個用HTML+CSS+JS實現(xiàn)的簡單應(yīng)用小案例,有:猜數(shù)字、表白墻、切換日夜間模式和待辦事項,需要的可以參考一下2022-02-02通過學(xué)習(xí)bootstrop導(dǎo)航條學(xué)會修改bootstrop顏色基調(diào)
這篇文章主要介紹了通過學(xué)習(xí)bootstrop導(dǎo)航條學(xué)會修改bootstrop顏色基調(diào),需要的朋友可以參考下2017-06-06淺談監(jiān)聽單選框radio改變事件(和layui中單選按鈕改變事件)
今天小編就為大家分享一篇淺談監(jiān)聽單選框radio改變事件(和layui中單選按鈕改變事件),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09JS插件amCharts實現(xiàn)繪制柱形圖默認(rèn)顯示數(shù)值功能示例
這篇文章主要介紹了JS插件amCharts實現(xiàn)繪制柱形圖默認(rèn)顯示數(shù)值功能,結(jié)合實例形式分析了amCharts插件繪制柱形圖并顯示數(shù)值的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11簡單談?wù)刯avascript中的變量、作用域和內(nèi)存問題
這篇文章主要介紹了簡單談?wù)刯avascript中的變量、作用域和內(nèi)存問題的相關(guān)資料,需要的朋友可以參考下2015-08-08