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
290
291
292
293
294
|
---
title: BigInt
slug: Web/JavaScript/Reference/Global_Objects/BigInt
tags:
- BigInt
- JavaScript
- методы BigInt
- свойства BigInt
translation_of: Web/JavaScript/Reference/Global_Objects/BigInt
---
<p>{{JSRef}}</p>
<p><strong><code>BigInt</code></strong> это встроенный объект, который предоставляет способ представлять целые числа больше 2<sup>53</sup> - 1, наибольшего числа, которое JavaScript может надёжно представить с {{JSxRef("Number")}} примитивом. Это максимальное значение можно получить, обратившись к {{JSxRef("Number.MAX_SAFE_INTEGER")}}.</p>
<dl>
</dl>
<h2 id="Описание">Описание</h2>
<p><code>BigInt</code> создаётся путём добавления <code>n</code> в конец целочисленного литерала — <code>10n</code> — или вызовом функции <code>BigInt()</code>.</p>
<pre class="brush: js">const theBiggestInt = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n
const hugeString = BigInt("9007199254740991");
// ↪ 9007199254740991n
const hugeHex = BigInt("0x1fffffffffffff");
// ↪ 9007199254740991n
const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111");
// ↪ 9007199254740991n
</pre>
<p>В некотором смысле он похож на {{JSxRef ("Number")}}, но отличается в некоторых ключевых моментах — его нельзя использовать с методами во встроенном объекте {{JSxRef ("Math")}} и нельзя смешивать в операциях с любыми экземплярами Number.</p>
<div class="blockIndicator warning">
<p>{{JSxRef("Number")}} и <code>BigInt</code> нельзя смешивать в операциях — они должны быть приведены к тому же типу.</p>
<p>Будьте осторожны приводя значения туда и обратно, так как точность BigInt может быть потеряна при приведении к числу (<code>Number)</code>.</p>
</div>
<h3 id="Тип">Тип</h3>
<p>При проверке с использованием оператора <code>typeof</code>, <code>BigInt</code> выдаёт тип <code>"bigint"</code>:</p>
<pre class="brush: js">typeof 1n === 'bigint'; // true
typeof BigInt('1') === 'bigint'; // true
</pre>
<p>При оборачивании в объект, BigInt будет представлен как обычный объект:</p>
<pre class="brush: js">typeof Object(1n) === 'object'; // true
</pre>
<h3 id="Операторы">Операторы</h3>
<p>Следующие операторы могут использоваться с <code>BigInt</code> (или объектом-обёрткой <code>BigInt</code>): <code>+</code>, <code>*</code>, <code>-</code>, <code>**</code>, <code>%</code>.</p>
<p><a href="/ru/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators">Побитовые операции</a> также поддерживаются, кроме <code>>>></code> (сдвиг вправо с заполнением нулями).</p>
<p>Не поддерживаемый унарный оператор (<code>+</code>) <a href="https://github.com/tc39/proposal-bigint/blob/master/ADVANCED.md#dont-break-asmjs">больше не ломает asm.js</a>.</p>
<pre class="brush: js">const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER);
// ↪ 9007199254740991n
const maxPlusOne = previousMaxSafe + 1n;
// ↪ 9007199254740992n
const theFuture = previousMaxSafe + 2n;
// ↪ 9007199254740993n, это работает!
const multi = previousMaxSafe * 2n;
// ↪ 18014398509481982n
const subtr = multi – 10n;
// ↪ 18014398509481972n
const mod = multi % 10n;
// ↪ 2n
const bigN = 2n ** 54n;
// ↪ 18014398509481984n
bigN * -1n
// ↪ –18014398509481984n
</pre>
<p>Оператор <code>/</code> также работает, как и ожидалось, с целыми числами. Однако, поскольку это BigInt, эта операция будет округляться в меньшую сторону, то есть она не будет возвращать какие-либо дробные цифры.</p>
<div class="blockIndicator warning">
<p>Результат операции с дробным результатом будет округлён в <strong><u>меньшую</u></strong> сторону при использовании <code>BigInt</code>.</p>
</div>
<pre class="brush: js">const expected = 4n / 2n;
// ↪ 2n
const rounded = 5n / 2n;
// ↪ 2n, not 2.5n
</pre>
<h3 id="Сравнения">Сравнения</h3>
<p><code>BigInt</code> равен {{JSxRef ("Number")}} только при нестрогом сравнении.</p>
<pre class="brush: js">0n === 0
// ↪ false
0n == 0
// ↪ true</pre>
<p>{{JSxRef("Global_Objects/Number", "Обычные числа")}} и <code>BigInt</code> можно сравнивать как обычно.</p>
<pre class="brush: js">1n < 2
// ↪ true
2n > 1
// ↪ true
2 > 2
// ↪ false
2n > 2
// ↪ false
2n >= 2
// ↪ true</pre>
<p>Они могут быть смешаны в массивах и отсортированы:</p>
<pre class="brush: 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]
</pre>
<p>Обратите внимание, что сравнения с <code>обьектом</code>-обёрткой <code>BigInt</code> действуют как с другими объектами, указывая на равенство только когда сравнивается идентичный экземпляр объекта:</p>
<pre class="brush: js">0n === Object(0n); // false
Object(0n) === Object(0n); // false
const o = Object(0n);
o === o // true
</pre>
<h3 id="Условные_выражения">Условные выражения</h3>
<p><code>BigInt</code> ведёт себя как {{JSxRef("Global_Objects/Number", "обычное число")}} в следующих случаях:</p>
<ul>
<li>Преобразуется в {{JSxRef("Global_Objects/Boolean", "Boolean")}} через функцию {{JSxRef("Global_Objects/Boolean", "Boolean")}}</li>
<li>Используется с логическими операторами {{JSxRef("Operators/Logical_Operators", "Logical Operators")}} <code>||</code>, <code>&&</code> и <code>!</code></li>
<li>В условном тесте, таком как {{JSxRef("Statements/if...else", "if statement")}}.</li>
</ul>
<pre class="brush: js">if (0n) {
console.log('Привет из if!');
} else {
console.log('Привет из else!');
}
// ↪ "Привет из else!"
0n || 12n
// ↪ 12n
0n && 12n
// ↪ 0n
Boolean(0n)
// ↪ false
Boolean(12n)
// ↪ true
!12n
// ↪ false
!0n
// ↪ true
</pre>
<h2 id="Конструктор">Конструктор</h2>
<dl>
<dt><code><a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/BigInt">BigInt()</a></code></dt>
<dd>Создаёт объект {{jsxref("BigInt")}}.</dd>
</dl>
<h2 id="Статические_методы">Статические методы</h2>
<dl>
<dt>{{JSxRef("BigInt.asIntN()")}}</dt>
<dd>Оборачивает BigInt в пределах от -2<sup>width-1</sup> до 2<sup>width-1</sup>-1</dd>
<dt>{{JSxRef("BigInt.asUintN()")}}</dt>
<dd>Оборачивает a BigInt в пределах от 0 до 2<sup>width</sup>-1</dd>
</dl>
<h2 id="Методы_экземпляра">Методы экземпляра</h2>
<dl>
<dt>{{JSxRef("BigInt.prototype.toLocaleString()")}}</dt>
<dd>Возвращает строку с языкозависимым представлением числа. Переопределяет метод {{JSxRef("Object.prototype.toLocaleString()")}}.</dd>
<dt>{{JSxRef("BigInt.prototype.toString()")}}</dt>
<dd>Возвращает строку, представляющую указанный объект по указанному основанию системы счисления. Переопределяет метод {{JSxRef("Object.prototype.toString()")}}.</dd>
<dt>{{JSxRef("BigInt.prototype.valueOf()")}}</dt>
<dd>Возвращает примитивное значение указанного объекта. Переопределяет метод {{JSxRef("Object.prototype.valueOf()")}}.</dd>
</dl>
<h2 id="Рекомендации_по_использованию">Рекомендации по использованию</h2>
<h3 id="Приведение">Приведение</h3>
<p>Поскольку приведение между {{JSxRef("Number")}} и <code>BigInt</code> может привести к потере точности, рекомендуется использовать<code> BigInt</code> только тогда, когда разумно ожидаются значения, превышающие 2<sup>53</sup> и не приводить между двумя типами.</p>
<h3 id="Криптография">Криптография</h3>
<p>Операции поддерживаемые <code>BigInt</code> не постоянны во времени. <code>BigInt</code> следовательно <a href="https://www.chosenplaintext.ca/articles/beginners-guide-constant-time-cryptography.html">не пригоден для использования в криптографии</a>.</p>
<h3 id="Использование_вместе_с_JSON">Использование вместе с JSON</h3>
<p>Использование {{jsxref("JSON.stringify()")}} с любым значением типа <code>BigInt</code> приведёт к <code>TypeError</code>, поскольку значения <code>BigInt</code> не преобразуется в JSON по умолчанию, однако вы можете реализовать свой собственный метод <code>toJSON</code>, если вам необходимо:</p>
<pre class="brush: js">BigInt.prototype.toJSON = function() { return this.toString() }
</pre>
<p>Теперь вместо ошибки, <code>JSON.stringify</code> будет создавать строку:</p>
<pre class="brush: js">JSON.stringify(BigInt(1))
// '"1"'
</pre>
<h2 id="Примеры">Примеры</h2>
<h3 id="Расчёт_простых_чисел">Расчёт простых чисел</h3>
<pre class="brush: js">// Возвращает true, если BigInt — простое число
function isPrime(p) {
for (let i = 2n; i * i <= p; i++) {
if (p % i === 0n) return false;
}
return true;
}
// Берет BigInt в качестве аргумента и возвращает 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</pre>
<h2 id="Спецификации">Спецификации</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Спецификация</th>
</tr>
<tr>
<td>{{SpecName("ESDraft", "#sec-bigint-objects", "<code>BigInt</code> objects")}}</td>
</tr>
</tbody>
</table>
<h2 id="Совместимость_браузера">Совместимость браузера</h2>
<div>
<p>{{Compat("javascript.builtins.BigInt")}}</p>
</div>
<h2 id="Смотрите_также">Смотрите также</h2>
<ul>
<li>{{JSxRef("Number")}}</li>
<li>{{JSxRef("Number.MAX_SAFE_INTEGER")}}</li>
</ul>
|