BigInt 类型

BigInt 是在 JavaScript 中引入的一种新的数字类型,它提供了对任意精度整数的支持。

let x = BigInt(999999999999999);
let type = typeof x;
// The JavaScript `typeof` a `BigInt` is "bigint":

在之前的 JavaScript 版本中,Number 类型只能安全地表示和操作 -(2^53 - 1) 和 2^53 - 1 之间的整数(即 Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER)。这是因为 Number 类型是根据 IEEE 754 双精度浮点数标准来实现的,而 BigInt 允许你去表示任意大的整数,不受 Number 的限制。

创建 BigInt

  • 通过在整数末尾添加 n 来直接为字面量创建一个 BigInt。
  • 使用 BigInt() 构造函数从字符串、数字或其他 BigInt 中创建一个新的 BigInt。

示例:

const bigIntLiteral = 1234567890123456789012345678901234567890n;
const bigIntFromNumber = BigInt(10); // 等同于 10n
const bigIntFromString = BigInt("1234567890123456789012345678901234567890");

操作

BigInt 可以使用像普通整数一样的数学运算符进行加、减、乘、除(注意,除法结果会向零取整),以及取模。然而,请注意,BigInt 类型不能与传统的 Number 类型混合运算,试图将 BigInt 和 Number 直接在表达式中混合使用将会抛出一个错误。如果需要混合这两种类型,需先进行显式转换。

示例:

const bigInt1 = 100n;
const bigInt2 = 200n;
console.log(bigInt1 + bigInt2); // 输出:300n
console.log(bigInt1 * bigInt2); // 输出:20000n
 
// 抛出 TypeError,不能将 BigInt 和 Number 直接混合运算
// console.log(bigInt1 + 10);
// let y = x / 2;   ERROR
 
// 正确的混合类型运算方式
console.log(bigInt1 + BigInt(10)); // 输出:110n

进制数

BigInt 也可以用十六进制、八进制或二进制表示法编写(in hexadecimal, octal, or binary notation):

let hex = 0x20000000000003n;
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;

比较操作

BigInt 可以用于比较操作,并且可以与 Number 类型进行比较,这是因为比较操作不像算术运算那样有可能溢出。

示例:

console.log(10n === BigInt(10)); // 输出:true
console.log(10n < 20); // 输出:true
console.log(10n > 20); // 输出:false

注意

虽然 BigInt 能提供超出 Number 安全整数范围的精确值,但它可能不适用于所有 JavaScript 环境,因为它还是相对较新的特性。在使用 BigInt 前,你应该检查目标环境是否支持此特性,尤其是在旧版浏览器或者某些 JavaScript 引擎中。

此外,由于 BigInt 可以存储非常大的数,因此在执行算术运算时可能会比普通的 Number 类型慢,尤其是当操作的数字非常大时。

总的来说,BigInt 为那些需要处理大整数的场景提供了解决方案,并使 JavaScript 的编程能力更进一步。