1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
|
---
title: BigInt
slug: Web/JavaScript/Reference/Global_Objects/BigInt
tags:
- BigInt
- クラス
- JavaScript
- リファレンス
browser-compat: javascript.builtins.BigInt
translation_of: Web/JavaScript/Reference/Global_Objects/BigInt
---
{{JSRef}}
**`BigInt`** は組み込みオブジェクトで、そのコンストラクターは `bigint` {{Glossary("Primitive", "プリミティブ")}} — または **BigInt 値** や単に **BigInt** と呼ばれることもありますが — を返します。これは 2^53 - 1 ([`Number.MAX_SAFE_INTEGER`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)、 `number` {{Glossary("Primitive", "プリミティブ")}} または *Number 値*で表すことができる最大の数) よりも大きな数を表すことができます。 BigInt 値は任意に巨大な整数に使用することができます。
## 解説
**BigInt 値**は、単に **BigInt** と呼ばれることもありますが、 `bigint` {{Glossary("Primitive", "プリミティブ")}}です。整数リテラルの末尾に `n` を追加するか、 {{jsxref("Global_Objects/BigInt/BigInt", "BigInt()")}} コンストラクターを呼び出し、整数値または文字列値を与えることで生成することができます (ただし `new` 演算子なしで)。
```js
const previouslyMaxSafeInteger = 9007199254740991n
const alsoHuge = BigInt(9007199254740991)
// ↪ 9007199254740991n
const hugeString = BigInt("9007199254740991")
// ↪ 9007199254740991n
const hugeHex = BigInt("0x1fffffffffffff")
// ↪ 9007199254740991n
const hugeOctal = BigInt("0o377777777777777777")
// ↪ 9007199254740991n
const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111")
// ↪ 9007199254740991n
```
BigInt はいくつかの点で Number と似ていますが、重要ないくつかの点が異なります。組み込みの [`Math`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Math) オブジェクト内のメソッドでは利用できず、演算で Number の値と混ぜることができません。同じ型に統一する必要があります。ただし、BigInt を Number へ変換する際には精度が落ちることがあるので、相互に変化する場合には注意が必要です。
### 型情報
`typeof` の `BigInt` 値 (`bigint` プリミティブ) に対する評価値は、"`bigint`" となります。
```js
typeof 1n === 'bigint' // true
typeof BigInt('1') === 'bigint' // true
```
BitInt の値は `Object` でラップすることができます。
```js
typeof Object(1n) === 'object' // true
```
### 演算子
以下の演算子は BigInt 値またはオブジェクトでラップした BigInt 値で使用することができます。
+ * - % **
[ビット操作演算子](/ja/docs/Web/JavaScript/Reference/Operators)は、同様に利用できますが、 `>>>` (論理的右シフト) は BigInt が常に符号付きなので除外されます。
同様に、単項演算子 (`+`) は [asm.js を壊さないように](https://github.com/tc39/proposal-bigint/blob/master/ADVANCED.md#dont-break-asmjs)対応していません。
```js
const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER)
// ↪ 9007199254740991n
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 値と演算すhる際に小数が切り捨てられます。実数を返すことはありません。
```js
const expected = 4n / 2n
// ↪ 2n
const truncated = 5n / 2n
// ↪ 2n, not 2.5n
```
### 比較演算
BigInt 値は Number 値と厳密等価ではありませんが、等価にはなります。
```js
0n === 0
// ↪ false
0n == 0
// ↪ true
```
Number と BigInt は通常通り比較できます。
```js
1n < 2
// ↪ true
2n > 1
// ↪ true
2 > 2
// ↪ false
2n > 2
// ↪ false
2n >= 2
// ↪ true
```
BigInt 値と Number 値は配列の要素に混在させたり並べ替えたりすることも可能です。
```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 ]
mixed.sort((a, b) => a - b)
// 型が混在した減算はできないので動作しない
// TypeError: can't convert BigInt value to Number value
// 適切な数値比較関数を使用した並べ替え
mixed.sort((a, b) => (a < b) ? -1 : ((a > b) ? 1 : 0))
// ↪ [ -12n, 0, 0n, 4n, 4, 6, 10 ]
```
なお、 `Object` にラップされた BigInt は他のオブジェクトと同様の振る舞いをします。同じインスタンス同士が比較された場合にのみ等価となります。
```js
0n === Object(0n) // false
Object(0n) === Object(0n) // false
const o = Object(0n)
o === o // true
```
### 条件式
BigInt 値は次のような場合は Number 値のように動作します。
- [`Boolean`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Boolean) へ変換される場合 ( [`Boolean`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Boolean) 関数を使用して)
- [論理演算子](/ja/docs/Web/JavaScript/Reference/Operators)の `||`、`&&`、`!`、または [`if`](/ja/docs/Web/JavaScript/Reference/Statements/if...else) 文のような条件式の中で使用された場合
```js
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()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt/BigInt)
- : 新しい BigInt 値を生成します。
<h2 id="Methods" name="Methods">静的メソッド</h2>
- [`BigInt.asIntN()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt/asIntN)
- : BigInt 値を符号付き整数値に丸め、その値を返します。
- [`BigInt.asUintN()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt/asUintN)
- : BigInt 値を符号なし整数値に丸め、その値を返します。
## インスタンスメソッド
- [`BigInt.prototype.toLocaleString()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt/toLocaleString)
- : この BigInt 値の言語に合わせた表現の文字列を返します。 [`Object.prototype.toLocaleString()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/toLocaleString) メソッドを上書きします。
- [`BigInt.prototype.toString()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt/toString)
- : この BigInt 値を指定された基数で表現した文字列を返します。 [`Object.prototype.toString()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/toString) メソッドを上書きします。
- [`BigInt.prototype.valueOf()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt/valueOf)
- : この BigInt 値を返します。 [`Object.prototype.valueOf()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf) メソッドを上書きします。
## 使用方法の推奨事項
## 型変換
Number 値と BigInt 値との間の型変換は精度が落ちる可能性があるため、次のことを推奨します。
- BigInt 値は、値が 2^53 を超えることが合理的に予想される場合にのみ使用する。
- BigInt 値と Number 値の間で型変換を行わない。
<h3 id="Cryptography" name="Cryptography">暗号処理</h3>
BigInt で対応している演算は、実行時間が一定ではないので、[タイミング攻撃](https://en.wikipedia.org/wiki/Timing_attack)を受ける可能性があります。したがって、 JavaScript の BigInt は暗号処理での使用には向きません。
### JSON での使用
[`JSON.stringify()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) を BigInt 値に対して使用すると `TypeError` が発生します。 BigInt 値は既定で JSON のシリアライズに対応していないため、ただし、必要であれば独自の `toJSON` メソッドを実装することができます。
```js
BigInt.prototype.toJSON = function() { return this.toString() }
```
`JSON.stringify` により、例外が発生する代わりに次のように文字列を生成するようになります。
```js
JSON.stringify(BigInt(1))
// '"1"'
```
## 例
### 素数の計算
```js
// 渡された BigInt が素数であった場合は true を返します
function isPrime(p) {
for (let i = 2n; i * i <= p; i++) {
if (p % i === 0n) return false;
}
return true
}
// 引数として BigInt 値を取り、 nth 番目の素数を BigInt 値として返します。
function nthPrime(nth) {
let maybePrime = 2n
let prime = 0n
while (nth >= 0n) {
if (isPrime(maybePrime)) {
nth--
prime = maybePrime
}
maybePrime++
}
return prime
}
nthPrime(20n)
// ↪ 73n
```
## 仕様書
{{Specifications}}
## ブラウザーの互換性
{{Compat}}
## 関連情報
- [`Number`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Number)
- [`Number.MAX_SAFE_INTEGER`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)
|