JavaScript标准内置对象BigInt

42 min read

BigInt

  从 ES2010 开始,JavaScript 提供了一种内置对象:BigInt,它提供了一种方法来表示大于 a53 - 1 的整数(原本是 js 中可以用 Number 表示的最大数字)。BigInt 可以表示任意大的整数。

表示方法

  • 整数字面量后面加 n
const theBiggestInt = 9007199254740991n;
  • 调用 BigInt()
const alsoHuge = BigInt(9007199254740991);

与 Number 不同点

  • 不能用于 Math 对象中的方法
  • 不能和任何 Number 实例混合运算,两者必须转换成同一种类型。转换时需要注意,因为 BigInt 变量在转换成 Number 变量时可能丢失精度。

类型信息

  使用 typeof 测试时,BigInt 对象返回“bigint”:

typeof 1n === "bigint"; // true

typeof BigInt("1") === "bigint"; // true

  使用 Object 包装后,BigInt 被认为是一个普通“object”:

typeof Object(1n) === "object"; // true

运算

  +、-、*、**、%这些操作符可以和 BigInt 一起使用。

  除>>>(无符号右移)之外的位操作也可以支持。因为 BigInt 都是有符号的,除>>>(无符号右移)不能用于 BigInt。

const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER); // ↪ 9007199254740991n

const theFuture = previousMaxSafe + 2n; // ↪ 9007199254740993n

const multi = previousMaxSafe * 2n;// ↪ 18014398509481982n

const subtr = multi  10n; // ↪ 18014398509481972n

const mod = multi % 10n; // ↪ 2n

const bigN = 2n ** 54n; // ↪ 18014398509481984n

bigN * -1n; // ↪ –18014398509481984n

  当使用 BigInt 时,带小数的运算会被取整。

const expected = 4n / 2n; // 2n

const rounded = 5n / 2n; // 2n

比较

  • 相等性
      BigInt 和 Number 不是严格相等的,但是是宽松相等的。
0n === 0; // false

0n == 0; // true
  • 大小
1n < 2; // true

2n > 1; // true

2n > 2; // false

2n >= 2; // true
  • 排序
const mixed = [4n, 6, -12n, 10, 4, 0, 0n];
mixed.sort(); // [-12n, 0, 0n, 10, 4n, 4, 6]
  • 条件
if (0n) {
  console.log(true);
}

// true