乍一看,一個新的基本數據類型,大個兒的Int?那麼這個大個的Int到底是幹什麼的呢?前端
做用: BigInt數據類型的目的是比Number數據類型支持的範圍更大的整數值。chrome
因此說它是個大個兒的Int徹底沒得問題,在對z大整數執行數學運算時,以任意精度表示整數的能力尤其重要,使用BigInt,整數溢出將再也不是問題。安全
此外,能夠安全地使用更加準確時間戳,大整數ID等,而無需使用變通方法。bash
在JS中,全部的數字都以雙精度64位浮點格式表示,那帶來的問題是什麼呢!?函數
沒錯,JS中的Number沒法精確表示很是大的整數,它會將很是大的整數四捨五入,確切地說,JS中的Number類型只能安全地表示-9007199254740991(-(2^53-1))和9007199254740991((2^53-1)),任何超出此範圍的整數值均可能失去精度spa
console.log(999999999999999); //=>10000000000000000
複製代碼
這就會帶來必定的安全問題,好比:.net
// 注意最後一位的數字
9007199254740992 === 9007199254740993; // → true
複製代碼
要建立BigInt,只須要在數字末尾追加n便可。 注:chrome 67+開始支持BigInt。code
console.log( 9007199254740995n ); // → 9007199254740995n
console.log( 9007199254740995 ); // → 9007199254740996
複製代碼
這就在必定程度上解決了Number四捨五入的問題cdn
另外一種建立BigInt的方法是用BigInt()構造函數blog
BigInt("9007199254740995"); // → 9007199254740995n
複製代碼
除一元加號(+)運算符外,全部算術運算符均可用於 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