# BigInt

BigInt 是一种内置对象,它提供了一种方法来表示大于 2^53 - 1 的整数。(因为js的数值表示部分,只有52位用于保存有效数字)这原本是 Javascript 中可以用 Number 表示的最大数字。BigInt 可以表示任意大的整数。

# 定义

可以用在一个整数字面量后面加 n 的方式定义一个 BigInt ,如:10n,或者调用函数 BigInt()(但不包含 new 运算符)并传递一个整数值或字符串值。

const theBiggestInt = 9007199254740991n;

const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n

const hugeString = BigInt("9007199254740991");
// ↪ 9007199254740991n

const hugeHex = BigInt("0x1fffffffffffff");
// ↪ 9007199254740991n

const hugeBin = BigInt(
  "0b11111111111111111111111111111111111111111111111111111",
);
// ↪ 9007199254740991n

它在某些方面类似于 Number,但是也有几个关键的不同点:不能用于Math 对象中的方法;不能和任何 Number实例混合运算,两者必须转换成同一种类型。在两种类型来回转换时要小心,因为 BigInt 变量在转换成 Number 变量时可能会丢失精度。

# 类型信息

使用 typeof 测试时, BigInt 对象返回 "bigint"

const s = 9007199254740991n;
typeof s === 'bigint'; // true

# 运算

以下操作符可以和 BigInt 一起使用: +*-**%BigInt 不支持单目 (+) 运算符。

const maxSafeInteger = BigInt(Number.MAX_SAFE_INTEGER);
console.log(maxSafeInteger, maxSafeInteger + 1n); // 9007199254740991n 9007199254740992n
console.log(maxSafeInteger * 2n); // 18014398509481982n
console.log(2n ** 54n); // 18014398509481984n
console.log(2n * 54n * -1n); // -108n

WARNING

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

# 比较

BigIntNumber不是严格相等的,但是宽松相等的。

0n === 0; // false
0n == 0; // true
1n < 2; // true
2n >= 2; // true

Boolean(2n); // true
Boolean(0n); // false
!12n; // false
!0n; // true

# 实例方法

const maxSafeInteger = BigInt(Number.MAX_SAFE_INTEGER);
const b = maxSafeInteger * 3n;
console.log(b.toLocaleString()); // 27,021,597,764,222,973
console.log(b.toString()); // 27021597764222973

# 在JSON中使用

对任何 BigInt 值使用 JSON.stringify() 都会引发 TypeError,因为默认情况下 BigInt 值不会在 JSON 中序列化。但是,如果需要,可以实现 toJSON 方法:

BigInt.prototype.toJSON = function () {
  return this.toString();
};
const x = {
  x: BigInt(Number.MAX_SAFE_INTEGER) * 2n
};
console.log(JSON.stringify(x)); // {"x":"18014398509481982"}

更详细文档 (opens new window)

上次更新: 1/22/2025, 9:39:13 AM