BigInt 类型 在 Javascript 中是一个数字的原始值,它可以表示任意大小的整数。使用 BigInt,你可以安全地存储和操作巨大的整数,甚至超过 Number 的安全整数限制(Number.MAX_SAFE_INTEGER)。
对 BigInt 的操作不是常数时间的。
创建 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
BigInt 类型的算数与位运算
你可以使用大多数运算符处理 BigInt,包括 +、*、-、** 和 %。
除法和有符号右移操作 >> 会丢失小数部分。
BigInt 不支持单目 (+) 运算符。
除 >>>(无符号右移)之外的 位操作 也可以支持。因为 BigInt 都是有符号的, >>> (无符号右移)不能用于 BigInt。
JavaScript 中没有无符号左移运算符 (<<<)。
BigInt 类型与 Number 类型
BigInt 类型的变量表示的整数可以超过 Number.MAX_SAFE_INTEGER,而 Number 类型的变量不可以:
// BigInt
const x = BigInt(Number.MAX_SAFE_INTEGER); // 9007199254740991n
x + 1n === x + 2n; // false,因为 9007199254740992n 和 9007199254740993n 不相等
// Number
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true,因为都等于 9007199254740992
BigInt 不能用于 Math 对象中的方法。
如果 BigInt 值在算术表达式中与常规 Number 值混合,或者它们相互隐式转换,则抛出 TypeError。
BigInt 值并不总是更精确的,也不总是比 Number 精确,因为 BigInt 不能表示小数,但可以更精确地表示大整数。这两种类型都不能相互替代。BigInt 变量在转换成 Number 变量时可能会丢失精度(整数部分)。Number 变量在转换成 BigInt 变量时可能会丢失精度(小数部分)。
BigInt 类型与 Number 类型的比较
BigInt 并不是严格等于有着相同数学值的 Number,而是宽松的相等(因为类型不同)。
0n === 0;
// ↪ false
0n == 0;
// ↪ true
Number 和 BigInt 可以进行比较。两者也可以混在一个数组内并排序。
1n < 2;
// ↪ true
2n > 1;
// ↪ true
const mixed = [4n, 6, -12n, 10, 4, 0, 0n];
// ↪ [4n, 6, -12n, 10, 4, 0, 0n]
mixed.sort();
// ↪ [-12n, 0, 0n, 10, 4n, 4, 6]
BigInt 类型的条件运算
BigInt 在需要转换成 Boolean 的时表现跟 Number 类似。
if (0n) {
console.log("Hello from the if!");
} else {
console.log("Hello from the else!");
}
// ↪ "Hello from the else!"
0n || 12n;
// ↪ 12n
0n && 12n;
// ↪ 0n
Boolean(0n);
// ↪ false
Boolean(12n);
// ↪ true
!12n;
// ↪ false
!0n;
// ↪ true
参考
对象 BigInt
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/BigInt
JavaScript 数据类型和数据结构
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures