--- title: BigInt slug: Web/JavaScript/Reference/Global_Objects/BigInt tags: - BigInt - JavaScript translation_of: Web/JavaScript/Reference/Global_Objects/BigInt ---
BigInt は組み込みオブジェクトで、 {{JSxRef("Number")}} プリミティブで表現できる最大の数、 {{JSxRef("Number.MAX_SAFE_INTEGER")}} よりも大きな数値を信頼できるものとして表現する方法を提供します。 BigInt は任意に巨大な整数に使用することができます。
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 はいくつかの点で {{JSxRef("Number")}} と似ていますが、重要ないくつかの点が異なります。 — 組込みの {{JSxRef("Math")}} オブジェクト内のメソッドでは利用できず、演算で Number のインスタンスと混ぜることができません。同じ型に統一する必要があります。ただし、BigInt を Number へ変換する際には精度が落ちることがあるので、相互に変化する場合には注意が必要です。
typeof の BigInt に対する評価値は、"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
/ 演算子もすべての数値に対して、期待される通りに動作します。ただ BigInt はBigDecimal ではないため、演算結果は 0 の方向に丸められます。別の言い方をすれば、小数を返すことはありません。
BigInt を使用した場合、結果が小数となるような演算は切り捨てられます。
const expected = 4n / 2n; // ↪ 2n const rounded = 5n / 2n; // ↪ 2n, not 2.5n
BigInt は {{JSxRef("Number")}} と厳密等価ではありませんが、等価にはなります。
0n === 0 // ↪ false 0n == 0 // ↪ true
{{JSxRef("Global_Objects/Number", "Number")}} と BigInt は通常通り比較できます。
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] mixed.sort((a, b) => a - b) // won't work since subtraction will not work with mixed types // TypeError: can't convert BigInt to number // sort with an appropriate numeric comparator mixed.sort((a, b) => (a < b) ? -1 : ((a > b) ? 1 : 0) // ↪ [ -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
BigInt が {{JSxRef("Global_Objects/Boolean", "Boolean")}} へ変換される次のような場合は、 {{JSxRef("Global_Objects/Number", "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
{{JSxRef("BigInt()")}}
新しいbigint 値を作ります。
BigInt オブジェクトへの属性追加が可能です。BigInt インスタンス全ての BigInt インスタンスは BigInt.prototype を継承します。このプロトタイプオブジェクトへの変更は、全ての BigInt インスタンスに影響します。
{{page("/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt/prototype", "Methods")}}
{{JSxRef("Number")}} と BigInt との間の型変換は精度が落ちる可能性があるため、 BigInt は値が論理的に253以上になる場合にのみ使用し、この2つの型の間で型変換を行わないこと推奨します。
BigInt で対応している演算は、実行時間が一定ではありません。従って、 BigInt は暗号処理での使用には向きません。
BigInt の値は既定で JSON のシリアライズに対応していないため、{{JSxRef("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
| 仕様書 |
|---|
{{SpecName("ESDraft", "#sec-bigint-objects", "BigInt objects")}} |
{{Compat("javascript.builtins.BigInt")}}