# 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
时,带小数的运算会被取整。
# 比较
BigInt
和 Number
不是严格相等的,但是宽松相等的。
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"}