此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
BigInt
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2020年9月.
BigInt 是一种内置对象,它提供了一种方法来表示大于2^53 - 1 的整数。这原本是 Javascript 中可以用Number 表示的最大数字。BigInt 可以表示任意大的整数。
In this article
描述
可以用在一个整数字面量后面加n 的方式定义一个BigInt ,如:10n,或者调用函数BigInt()(但不包含new 运算符)并传递一个整数值或字符串值。
const theBiggestInt = 9007199254740991n;const alsoHuge = BigInt(9007199254740991);// ↪ 9007199254740991nconst hugeString = BigInt("9007199254740991");// ↪ 9007199254740991nconst hugeHex = BigInt("0x1fffffffffffff");// ↪ 9007199254740991nconst hugeBin = BigInt( "0b11111111111111111111111111111111111111111111111111111",);// ↪ 9007199254740991n它在某些方面类似于Number ,但是也有几个关键的不同点:不能用于Math 对象中的方法;不能和任何Number 实例混合运算,两者必须转换成同一种类型。在两种类型来回转换时要小心,因为BigInt 变量在转换成Number 变量时可能会丢失精度。
类型信息
使用typeof 测试时,BigInt 对象返回 "bigint" :
typeof 1n === "bigint"; // truetypeof BigInt("1") === "bigint"; // true使用Object 包装后,BigInt 被认为是一个普通 "object" :
typeof Object(1n) === "object"; // true运算
以下操作符可以和BigInt 一起使用:+、*、-、**、%。除>>> (无符号右移)之外的位操作 也可以支持。因为BigInt 都是有符号的,>>> (无符号右移)不能用于BigInt。为了兼容 asm.js,BigInt 不支持单目 (+) 运算符。
const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER);// ↪ 9007199254740991nconst maxPlusOne = previousMaxSafe + 1n;// ↪ 9007199254740992nconst theFuture = previousMaxSafe + 2n;// ↪ 9007199254740993n, this works now!const multi = previousMaxSafe * 2n;// ↪ 18014398509481982nconst subtr = multi – 10n;// ↪ 18014398509481972nconst mod = multi % 10n;// ↪ 2nconst bigN = 2n ** 54n;// ↪ 18014398509481984nbigN * -1n// ↪ –18014398509481984n/ 操作符对于整数的运算也没问题。可是因为这些变量是BigInt 而不是BigDecimal ,该操作符结果会向零取整,也就是说不会返回小数部分。
警告:当使用BigInt 时,带小数的运算会被取整。
const expected = 4n / 2n;// ↪ 2nconst rounded = 5n / 2n;// ↪ 2n, not 2.5n比较
BigInt 和Number 不是严格相等的,但是宽松相等的。
0n === 0;// ↪ false0n == 0;// ↪ trueNumber 和BigInt 可以进行比较。
1n < 2;// ↪ true2n > 1;// ↪ true2 > 2;// ↪ false2n > 2;// ↪ false2n >= 2;// ↪ 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]注意被Object 包装的BigInt 使用 object 的比较规则进行比较,只用同一个对象在比较时才会相等。
0n === Object(0n); // falseObject(0n) === Object(0n); // falseconst o = Object(0n);o === o; // true条件
BigInt 在需要转换成Boolean 的时表现跟Number 类似:如通过Boolean 函数转换;用于Logical Operators||,&&, 和! 的操作数;或者用于在像if statement 这样的条件语句中。
if (0n) { console.log("Hello from the if!");} else { console.log("Hello from the else!");}// ↪ "Hello from the else!"0n || 12n;// ↪ 12n0n && 12n;// ↪ 0nBoolean(0n);// ↪ falseBoolean(12n);// ↪ true!12n;// ↪ false!0n;// ↪ true构造器
静态方法
BigInt.asIntN()将 BigInt 值转换为一个 -2^(width-1) 与 2^(width-1) - 1 之间的有符号整数。
BigInt.asUintN()将一个 BigInt 值转换为 0 与 2^(width) - 1 之间的无符号整数。
实例方法
BigInt.prototype.toLocaleString()返回此数字的 language-sensitive 形式的字符串。覆盖
Object.prototype.toLocaleString()方法。BigInt.prototype.toString()返回以指定基数 (base) 表示指定数字的字符串。覆盖
Object.prototype.toString()方法。BigInt.prototype.valueOf()返回指定对象的基元值。覆盖
Object.prototype.valueOf()方法。
使用建议
>转化
由于在Number 与BigInt 之间进行转换会损失精度,因而建议仅在值可能大于 2^53 时使用BigInt 类型,并且不在两种类型之间进行相互转换。
密码学
由于对BigInt 的操作不是常数时间的,因而BigInt不适合用于密码学。
在 JSON 中使用
对任何BigInt 值使用JSON.stringify() 都会引发TypeError,因为默认情况下BigInt 值不会在JSON 中序列化。但是,如果需要,可以实现toJSON 方法:
BigInt.prototype.toJSON = function () { return this.toString();};JSON.stringify 现在生成如下字符串,而不是抛出异常:
JSON.stringify(BigInt(1));// '"1"'示例
>计算质数
function isPrime(n) { if (n < 2n) { return false; } if (n % 2n === 0n) { return n === 2n; } for (let factor = 3n; factor * factor <= n; factor += 2n) { if (n % factor === 0n) { return false; } } return true;}// 接收一个 BigInt 值参数,以 BigInt 值返回第 n 个质数值function nthPrime(nth) { let maybePrime = 2n; let prime = 0n; while (nth >= 0n) { if (isPrime(maybePrime)) { nth--; prime = maybePrime; } maybePrime++; } return prime;}nthPrime(20n);// 73n备注:isPrime() 实现仅供演示。在实际应用中,为了避免重复计算,会使用大量记忆化的算法,例如埃拉托斯特尼筛法。
规范
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-bigint-objects> |