JS新增基本數據類型---BigInt

它是個什麼東西?

乍一看,一個新的基本數據類型,大個兒的Int?那麼這個大個的Int到底是幹什麼的呢?前端

做用: BigInt數據類型的目的是比Number數據類型支持的範圍更大的整數值。chrome

因此說它是個大個兒的Int徹底沒得問題,在對z大整數執行數學運算時,以任意精度表示整數的能力尤其重要,使用BigInt,整數溢出將再也不是問題。安全

此外,能夠安全地使用更加準確時間戳,大整數ID等,而無需使用變通方法。bash

爲何須要BigInt?

在JS中,全部的數字都以雙精度64位浮點格式表示,那帶來的問題是什麼呢!?函數

沒錯,JS中的Number沒法精確表示很是大的整數,它會將很是大的整數四捨五入,確切地說,JS中的Number類型只能安全地表示-9007199254740991(-(2^53-1))和9007199254740991((2^53-1)),任何超出此範圍的整數值均可能失去精度spa

console.log(999999999999999);  //=>10000000000000000
複製代碼

這就會帶來必定的安全問題,好比:.net

// 注意最後一位的數字	

9007199254740992 === 9007199254740993;    // → true
複製代碼

建立BigInt

要建立BigInt,只須要在數字末尾追加n便可。 注:chrome 67+開始支持BigInt。code

console.log( 9007199254740995n );    // → 9007199254740995n	
console.log( 9007199254740995 );     // → 9007199254740996
複製代碼

這就在必定程度上解決了Number四捨五入的問題cdn

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

BigInt("9007199254740995");    // → 9007199254740995n
複製代碼

BigInt的運算

除一元加號(+)運算符外,全部算術運算符均可用於 BigInt

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

複製代碼

前端小智說:BigInt不支持一元加號運算符的緣由多是某些程序可能依賴於 + 始終生成Number的不變量,或者拋出異常。更改 +的行爲也會破壞 asm.js代碼。

隱式類型轉換

由於隱式類型轉換可能丟失信息,因此不容許在 bigint和 Number 之間進行混合操做。當混合使用大整數和浮點數時,結果值可能沒法由 BigInt或 Number精確表示。

小數不能精準地轉換爲BigInt,大於Number範圍的BigInt也不能準確地轉換爲數字,因此不容許兩者存在隱式轉換。

如果非要計算的話,須要強制轉換一下

BigInt(10) + 10n;    // → 20n	

// 或者	

10 + Number(10n);    // → 20
複製代碼

總結

BigInt是一種新的數據類型,能夠表示超過Number範圍的數字,防止超大整數出現的安全問題。此外還能夠表示高分辨率的時間戳,使用大整數id等。

Number和BigInt操做數不能夠隱式轉換,計算時需顯示轉換。


參考出處: JS 最新數據基本類型:BigInt

相關文章
相關標籤/搜索