BigInt

BigInt は組み込みオブジェクトで、 Number プリミティブで表現できる最大の数、 253 - 1 よりも大きな数値を信頼できるものとして表現する方法を提供します。 BigInt は任意に巨大な整数に使用することができます。

BigInt は現在、 ECMAScript 仕様書ステージ3 にあります。

草稿がステージ4、つまり最終仕様書になると、 BigInt は JavaScript の第二の組込み数値型になる予定です。

BigInt は JavaScript において、 ES2015 で Symbol が追加されて以来の新しいプリミティブ型になる予定です。

構文

BigInt(value);

引数

value
作成されるオブジェクトの値です。文字列、もしくは整数を指定できます。

メモ: BigInt()new 演算子と共に用いることはできません。

解説

BigInt は10進数の整数リテラルの末尾に n をつけて 10n とするか、 BigInt() 関数を呼び出すことで作成することができます。

const theBiggestInt = 9007199254740991n;

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

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

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

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

BigInt はいくつかの点で Number と似ていますが、重要ないくつかの点が異なります。 — 組込みの Math オブジェクト内のメソッドでは利用できず、演算で Number のインスタンスと混ぜることができません。同じ型に統一する必要があります。ただし、BigIntNumber へ変換する際には精度が落ちることがあるので、相互に変化する場合には注意が必要です。

型情報

typeofBigInt に対する評価値は、"bigint" となります。

typeof 1n === 'bigint'; // true
typeof BigInt('1') === 'bigint'; // true

Object でラップされている場合は、 BigInt は通常の "object" として扱われます。

typeof Object(1n) === 'object'; // true

演算子

BigInt (または Object でラップした BigInt) を利用することができる演算子は、 +, *, -, **, % です。ビット操作演算子は、同様に利用できますが、 >>> (論理的右シフト) は BigInt が常に符号付きなので除きます。同様に、単項演算子 (+) は asm.js を破らないように対応していません。

const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER);
// ↪ 9007199254740991

const maxPlusOne = previousMaxSafe + 1n;
// ↪ 9007199254740992n
 
const theFuture = previousMaxSafe + 2n;
// ↪ 9007199254740993n, this works now!

const multi = previousMaxSafe * 2n;
// ↪ 18014398509481982n

const subtr = multi – 10n;
// ↪ 18014398509481972n

const mod = multi % 10n;
// ↪ 2n

const bigN = 2n ** 54n;
// ↪ 18014398509481984n

bigN * -1n
// ↪ –18014398509481984n

/ 演算子もすべての数値に対して、期待される通りに動作します。ただ BigIntBigDecimal ではないため、演算結果は 0 の方向に丸められます。別の言い方をすれば、小数を返すことはありません。

BigInt を使用した場合、結果が小数となるような演算は切り捨てられます。

const expected = 4n / 2n;
// ↪ 2n

const rounded = 5n / 2n;
// ↪ 2n, not 2.5n

比較演算

BigIntNumber と厳密等価ではありませんが、等価にはなります。

0n === 0
// ↪ false

0n == 0
// ↪ true

NumberBigInt は通常通り比較できます。

1n < 2
// ↪ true

2n > 1
// ↪ true

2 > 2
// ↪ false

2n > 2
// ↪ false

2n >= 2
// ↪ true

配列の要素に混在させることでき、並べ替えも可能です。

const mixed = [4n, 6, -12n, 10, 4, 0, 0n];
// ↪  [4n, 6, -12n, 10, 4, 0, 0n]

mixed.sort();
// ↪ [-12n, 0, 0n, 4n, 4, 6, 10]

なお、 Object にラップされた BigInt は他のオブジェクトと同様の振る舞いをします。同じインスタンス同士が比較された場合にのみ、等価となります:

0n === Object(0n); // false
Object(0n) === Object(0n); // false

const o = Object(0n);
o === o // true

条件式

BigIntBoolean へ変換される場合は、 Number と同様の動作をします。 Boolean 関数を利用した場合、論理演算子 ||、`&&`、! で使用される場合、 if 文などの条件式に使用される場合に変換が行われます。

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.asIntN()
BigInt の値を -2width-1 ~ 2width-1-1 の間に丸めます。
BigInt.asUintN()
BigInt の値を 0 ~ 2width-1 の間に丸めます。

プロパティ

BigInt.prototype
BigInt オブジェクトへの属性追加が可能です。

BigInt インスタンス

全ての BigInt インスタンスは BigInt.prototype を継承します。このプロトタイプオブジェクトへの変更は、全ての BigInt インスタンスに影響します。

メソッド

BigInt.prototype.toLocaleString()
Returns a string with a language-sensitive representation of this number. Overrides the Object.prototype.toLocaleString() method.
BigInt.prototype.toString()
Returns a string representing the specified object in the specified radix (base). Overrides the Object.prototype.toString() method.
BigInt.prototype.valueOf()
Returns the primitive value of the specified object. Overrides the Object.prototype.valueOf() method.

使用方法の推奨事項

型変換

NumberBigInt との間の型変換は精度が落ちる可能性があるため、 BigInt は値が論理的に253以上になる場合にのみ使用し、この2つの型の間で型変換を行わないこと推奨します。

暗号処理

BigInt で対応している演算は、実行時間が一定ではありません。従って、 BigInt暗号処理での使用には向きません

JSON での使用

BigInt の値は既定で JSON のシリアライズに対応していないため、JSON.stringify()BigInt 値に対して使用すると TypeError が発生します。ただし、必要であれば独自の toJSON メソッドを実装することができます。

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

JSON.stringify により、例外が発生する代わりに次のように文字列を生成するようになります。

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

素数の計算

function isPrime(p) {
  for (let i = 2n; i * i <= p; i++) {
    if (p % i === 0n) return false;
  }
  return true;
}

// Takes a BigInt as an argument and returns a BigInt
function nthPrime(nth) {
  let maybePrime = 2n;
  let prime = 0n;
  
  while (nth >= 0n) {
    if (isPrime(maybePrime)) {
      nth -= 1n;
      prime = maybePrime;
    }
    maybePrime += 1n;
  }
  
  return prime;
}

nthPrime(20n)
// ↪ 73n

仕様書

仕様書 状態
BigInt ステージ3

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
BigIntChrome 完全対応 67Edge 未対応 なしFirefox 完全対応 68IE 未対応 なしOpera 完全対応 54Safari 未対応 なしWebView Android 完全対応 67Chrome Android 完全対応 67Firefox Android 完全対応 68Opera Android 完全対応 48Safari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 完全対応 10.4.0
asIntNChrome 完全対応 67Edge 未対応 なしFirefox 完全対応 68IE 未対応 なしOpera 完全対応 54Safari 未対応 なしWebView Android 完全対応 67Chrome Android 完全対応 67Firefox Android 完全対応 68Opera Android 完全対応 48Safari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 完全対応 10.4.0
asUintNChrome 完全対応 67Edge 未対応 なしFirefox 完全対応 68IE 未対応 なしOpera 完全対応 54Safari 未対応 なしWebView Android 完全対応 67Chrome Android 完全対応 67Firefox Android 完全対応 68Opera Android 完全対応 48Safari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 完全対応 10.4.0
prototypeChrome 完全対応 67Edge 未対応 なしFirefox 完全対応 68IE 未対応 なしOpera 完全対応 54Safari 未対応 なしWebView Android 完全対応 67Chrome Android 完全対応 67Firefox Android 完全対応 68Opera Android 完全対応 48Safari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 完全対応 10.4.0
toLocaleStringChrome 完全対応 67Edge 未対応 なしFirefox 完全対応 68IE 未対応 なしOpera 完全対応 54Safari 未対応 なしWebView Android 完全対応 67Chrome Android 完全対応 67Firefox Android 完全対応 68Opera Android 完全対応 48Safari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 完全対応 10.4.0
toStringChrome 完全対応 67Edge 未対応 なしFirefox 完全対応 68IE 未対応 なしOpera 完全対応 54Safari 未対応 なしWebView Android 完全対応 67Chrome Android 完全対応 67Firefox Android 完全対応 68Opera Android 完全対応 48Safari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 完全対応 10.4.0
valueOfChrome 完全対応 67Edge 未対応 なしFirefox 完全対応 68IE 未対応 なしOpera 完全対応 54Safari 未対応 なしWebView Android 完全対応 67Chrome Android 完全対応 67Firefox Android 完全対応 68Opera Android 完全対応 48Safari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 完全対応 10.4.0

凡例

完全対応  
完全対応
未対応  
未対応

関連情報