JavaScript:如何理解BigInt類型?


如何理解BigInt?

BigInt是一種新的數據類型,用於當整數值大於Number數據類型支持的范圍時。這種數據類型允許我們安全地對大整數執行算術操作,表示高分辨率的時間戳,使用大整數id,等等,而不需要使用庫。

為什么需要BigInt?

在JS中,所有的數字都以雙精度64位浮點格式表示,那這會帶來什么問題呢?
這導致JS中的Number無法精確表示非常大的整數,它會將非常大的整數四舍五入,確切地說,JS中的Number類型只能安全地表示-9007199254740991(-(253-1))和9007199254740991((253-1)),任何超出此范圍的整數值都可能失去精度。

console.log(999999999999999);  //=>10000000000000000

同時也會有一定的安全性問題:

9007199254740992 === 9007199254740993;    // → true 居然是true!

如何創建並使用BigInt?

要創建BigInt,只需要在數字末尾追加n即可。

console.log( 9007199254740995n );    // → 9007199254740995n	
console.log( 9007199254740995 );     // → 9007199254740996

另一種創建BigInt的方法是用BigInt()構造函數

BigInt("9007199254740995");    // → 9007199254740995n

簡單使用如下:

10n + 20n;    // → 30n	
10n - 20n;    // → -10n	
+10n;         // → TypeError: Cannot convert a BigInt value to a number	
-10n;         // → -10n	
10n * 20n;    // → 200n	
20n / 10n;    // → 2n	
23n % 10n;    // → 3n	
10n ** 3n;    // → 1000n	

const x = 10n;	
++x;          // → 11n	
--x;          // → 9n
console.log(typeof x);   //"bigint"

值得警惕的點

1.BigInt不支持一元加號運算符, 這可能是某些程序可能依賴於 + 始終生成 Number 的不變量,或者拋出異常。另外,更改 + 的行為也會破壞 asm.js代碼。

2.因為隱式類型轉換可能丟失信息,所以不允許在bigint和 Number 之間進行混合操作。當混合使用大整數和浮點數時,結果值可能無法由BigInt或Number精確表示。

10 + 10n;    // → TypeError

3.不能將BigInt傳遞給Web api和內置的 JS 函數,這些函數需要一個 Number 類型的數字。嘗試這樣做會報TypeError錯誤。

Math.max(2n, 4n, 6n);    // → TypeError

4.當 Boolean 類型與 BigInt 類型相遇時,BigInt的處理方式與Number類似,換句話說,只要不是0n,BigInt就被視為truthy的值。

if(0n){//條件判斷為false

}
if(3n){//條件為true

}

5.元素都為BigInt的數組可以進行sort。
6.BigInt可以正常地進行位運算,如|、&、<<、>>和^

瀏覽器兼容性

caniuse的結果:
{{uploading-image-170815.png(uploading...)}}
其實現在的兼容性並不怎么好,只有chrome67、firefox、Opera這些主流實現,要正式成為規范,其實還有很長的路要走。

我們期待BigInt的光明前途!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM