TypeScript BigInt
本節介紹的 bigint 數據類型是用來表示那些已經超出了 number 類型最大值的整數值,對於總是被詬病的整數溢出問題,使用了 bigint 後將完美解決。
1. 慕課解釋
bigint
是一種基本數據類型(primitive data type)。
JavaScript 中可以用 Number
表示的最大整數爲 2^53 - 1
,可以寫爲 Number.MAX_SAFE_INTEGER
。如果超過了這個界限,可以用 BigInt
來表示,它可以表示任意大的整數。
2. 語法
在一個整數字面量後加 n
的方式定義一個 BigInt
,如:10n
或者調用函數 BigInt()
:
const theBiggestInt = 9007199254740991n
const alsoHuge = BigInt(9007199254740991)
const hugeString = BigInt("9007199254740991")
theBiggestInt === alsoHuge // true
theBiggestInt === hugeString // true
代碼解釋:
第 1-3 行,分別是三種表達整數 9007199254740991
的方式,方式不同含義相同,所以完全相等。
BigInt
與 Number
的不同點:
BigInt
不能用於Math
對象中的方法。BigInt
不能和任何Number
實例混合運算,兩者必須轉換成同一種類型。BigInt
變量在轉換爲Number
變量時可能會丟失精度。
const biggest = Number.MAX_SAFE_INTEGER
const biggest1 = biggest + 1
const biggest2 = biggest + 2
biggest1 === biggest2 // true 超過精度
代碼解釋:
第 1 行,聲明瞭一個 number 類型最大值的變量 biggest
,對於 number 類型來說,這個就是最大精度。
第 3-4 行,最大精度就是這個容器已經完全滿了,無論往上加多少都會溢出,所以這兩個值是相等的。
而使用 BigInt
:
const biggest = BigInt(Number.MAX_SAFE_INTEGER)
const biggest1 = biggest + 1n
const biggest2 = biggest + 2n
biggest1 === biggest2 // false
代碼解釋:
第 1 行,聲明瞭一個 bigint 類型的變量 biggest
。
第 3-4 行,bigint 類型就是用來表示那些已經超出了 number 類型最大值的整數值,也就是這個容器還沒滿,在此基礎上加上兩個不同的值,其結果不相等。
3. 類型信息
使用 typeof
檢測類型時,BigInt
對象返回 bigint
:
typeof 10n === 'bigint' // true
typeof BigInt(10) === 'bigint' // true
typeof 10 === 'number' // true
typeof Number(10) === 'number' // true
代碼解釋:
typeof
操作符返回一個字符串,表示未經計算的操作數的類型,用來判斷基礎數據類型。
第 1-2 行,兩個書寫方式都是 bigint 類型,所以相等。
第 4-5 行,兩種書寫方式都是 number 類型,所以相等。
4. 運算
BigInt
可以正常使用 +
、-
、*
、/
、**
、%
符號進行運算:
const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER) // 9007199254740991n
const maxPlusOne = previousMaxSafe + 1n // 9007199254740992n
const multi = previousMaxSafe * 2n // 18014398509481982n
const subtr = multi – 10n // 18014398509481972n
const mod = multi % 10n // 2n
const bigN = 2n ** 54n // 18014398509481984n
Tip: 當使用 /
操作符時,會向下取整,不會返回小數部分:
const divided = 5n / 2n // 2n, not 2.5n
5. 比較 與 條件
Number
和 BigInt
可以進行比較:
0n === 0 // false
0n == 0 // true
1n < 2 // true
2n > 1 // true
2 > 2 // false
2n > 2 // false
2n >= 2 // true
條件判斷:
if (0n) {
console.log('條件成立!');
} else {
console.log('條件不成立!'); // 輸出結果
}
0n || 10n // 10n
0n && 10n // 0n
Boolean(0n) // false
Boolean(10n) // true
!10n // false
!0n // true
代碼解釋:
後面會有一節介紹 Truthy 與 Falsy
,這裏先簡單提下。除了明確的 true 和 false 兩個 boolean 類型外,JavaScript 可以在需要用到布爾類型值的上下文中使用強制類型轉換將值轉換爲布爾值。
比如 0 是假,10 是真。那麼,同樣的,0n 是假,10n 是真。
6. 小結
本小節介紹了 BigInt
類型相關知識,由於在 Number
與 BigInt
之間進行轉換會損失精度,建議:
- 不要在兩種類型之間進行相互轉換。
- 僅在值可能大於
2^53 - 1
時使用BigInt
。