JavaScript BigInt
JavaScript BigInt 變量用于存儲太大而無法用普通 JavaScript 數字表示的大整數值。
JavaScript 整數精度
JavaScript 整數最多只能精確到 15 位:
整數精度
let x = 999999999999999; let y = 9999999999999999;
在 JavaScript 中,所有數字都以 64 位浮點格式(IEEE 754 標準)存儲。
根據此標準,大整數無法被精確表示,會被四舍五入。
因此,JavaScript 只能安全地表示以下范圍內的整數:
- 最大為 9007199254740991(253-1)
- 最小為 -9007199254740991(-(253-1))
超出此范圍的整數值會失去精度。
如何創建 BigInt
如需創建 BigInt,可以在整數末尾添加 n
,或調用 BigInt()
函數:
例子 1
let x = 9999999999999999; let y = 9999999999999999n;
例子 2
let x = 1234567890123456789012345n; let y = BigInt(1234567890123456789012345)
BigInt:一種新的 JavaScript 數據類型
BigInt 的 JavaScript 類型是 "bigint
":
實例
let x = BigInt(999999999999999); let type = typeof x;
BigInt 是 JavaScript 中的第二個數值數據類型(在 Number 之后)。
對于 BigInt,JavaScript 支持的數據類型總數為 8 種:
- String
- Number
- Bigint
- Boolean
- Undefined
- Null
- Symbol
- Object
BigInt 運算符
可用于 JavaScript Number 的運算符也可用于 BigInt。
BigInt 乘法實例
let x = 9007199254740995n; let y = 9007199254740995n; let z = x * y;
注意
不允許在 BigInt 和 Number 之間進行算術運算(類型轉換會丟失信息)。
BigInt 無法進行無符號右移操作(>>>),因為它沒有固定的寬度。
BigInt 小數
BigInt 不能有小數。
BigInt 除法實例
let x = 5n; let y = x / 2; // Error: Cannot mix BigInt and other types, use explicit conversion.
let x = 5n; let y = Number(x) / 2;
BigInt 十六進制、八進制和二進制
BigInt 也可以寫成十六進制、八進制或二進制表示法:
BigInt 十六進制實例
let hex = 0x20000000000003n; let oct = 0o400000000000000003n; let bin = 0b100000000000000000000000000000000000000000000000000011n;
Precision Curiosity
舍入可能會危及程序安全:
MAX_SAFE_INTEGER 實例
9007199254740992 === 9007199254740993; // 為 true !!!
瀏覽器支持
自 2020 年 9 月以來,所有瀏覽器都支持 BigInt:
Chrome | Edge | Firefox | Safari | Opera |
---|---|---|---|---|
Chrome 67 | Edge 79 | Firefox 68 | Safari 14 | Opera 54 |
2018 年 5 月 | 2020 年 1 月 | 2019 年 7 月 | 2020 年 9 月 | 2018 年 6 月 |
最小和最大安全整數
ES6 向 Number 對象添加了 max 和 min 屬性:
MAX_SAFE_INTEGER
MIN_SAFE_INTEGER
MAX_SAFE_INTEGER 實例
let x = Number.MAX_SAFE_INTEGER;
MIN_SAFE_INTEGER 實例
let x = Number.MIN_SAFE_INTEGER;
新的數字方法
ES6 還為 Number 對象添加了兩個新方法:
Number.isInteger()
Number.isSafeInteger()
Number.isInteger() 方法
如果參數是整數,則 Number.isInteger() 方法返回 true
。
isInteger() 實例
Number.isInteger(10); Number.isInteger(10.5);
Number.isSafeInteger() 方法
安全整數是可以精確表示為雙精度數的整數。
如果參數是安全整數,則 Number.isSafeInteger() 方法返回 true
。
isSafeInteger() 實例
Number.isSafeInteger(10); Number.isSafeInteger(12345678901234567890);
安全整數是從 -(253 - 1) 到 +(253 - 1) 的所有整數。
這是一個安全整數:9007199254740991。這不是一個安全整數:9007199254740992。