Movatterモバイル変換


[0]ホーム

URL:


  1. 面向开发者的 Web 技术
  2. JavaScript
  3. JavaScript 参考
  4. JavaScript 标准内置对象
  5. BigInt

此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in EnglishAlways switch to English

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 可以表示任意大的整数。

描述

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

js
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" :

js
typeof 1n === "bigint"; // truetypeof BigInt("1") === "bigint"; // true

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

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

运算

以下操作符可以和BigInt 一起使用:+*-**%。除>>> (无符号右移)之外的位操作 也可以支持。因为BigInt 都是有符号的,>>> (无符号右移)不能用于BigInt为了兼容 asm.jsBigInt 不支持单目 (+) 运算符。

js
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 时,带小数的运算会被取整。

js
const expected = 4n / 2n;// ↪ 2nconst rounded = 5n / 2n;// ↪ 2n, not 2.5n

比较

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

js
0n === 0;// ↪ false0n == 0;// ↪ true

NumberBigInt 可以进行比较。

js
1n < 2;// ↪ true2n > 1;// ↪ true2 > 2;// ↪ false2n > 2;// ↪ false2n >= 2;// ↪ true

两者也可以混在一个数组内并排序。

js
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 的比较规则进行比较,只用同一个对象在比较时才会相等。

js
0n === Object(0n); // falseObject(0n) === Object(0n); // falseconst o = Object(0n);o === o; // true

条件

BigInt 在需要转换成Boolean 的时表现跟Number 类似:如通过Boolean 函数转换;用于Logical Operators||,&&, 和! 的操作数;或者用于在像if statement 这样的条件语句中。

js
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()

创建BigInt 对象。

静态方法

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() 方法。

使用建议

转化

由于在NumberBigInt 之间进行转换会损失精度,因而建议仅在值可能大于 2^53 时使用BigInt 类型,并且不在两种类型之间进行相互转换。

密码学

由于对BigInt 的操作不是常数时间的,因而BigInt不适合用于密码学

在 JSON 中使用

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

js
BigInt.prototype.toJSON = function () {  return this.toString();};

JSON.stringify 现在生成如下字符串,而不是抛出异常:

js
JSON.stringify(BigInt(1));// '"1"'

示例

计算质数

js
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

浏览器兼容性

参见

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp