Skip to content

Commit db249e4

Browse files
committed
add translation of BigInt
1 parent b72bd3d commit db249e4

File tree

3 files changed

+150
-7
lines changed

3 files changed

+150
-7
lines changed

1-js/02-first-steps/05-types/article.md

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,25 @@ n = 12.345;
6262

6363
Подробнее о работе с числами мы поговорим в главе <info:number>.
6464

65+
## BigInt
66+
67+
В JavaScript, тип "number" не может содержать числа больше чем <code>2<sup>53</sup></code> (или меньше чем <code>-2<sup>53</sup></code> для отрицательных), это техническое ограничение вызвано их внутренним представлением. Это число состоящее из 16 цифр, поэтому в большинстве случаев данное ограничение не является проблемой. Но иногда нам нужны действительно большие цифры, например в криптографии или при использовании метки времени ("timestamp") с микросекундами.
68+
69+
Тип `BigInt` был добавлен в JavaScript, чтобы дать возможность работать с целыми числами произвольной длины.
70+
71+
Чтобы создать значение типа `BigInt` необходимо добавить `n` в конец числового литерала:
72+
73+
```js
74+
// символ "n" в конце означает, что это BigInt
75+
const bigInt = 1234567890123456789012345678901234567890n;
76+
```
77+
78+
Так как `BigInt` числа нужны достаточно редко, мы рассмотрим их в отдельной главе <info:bigint>.
79+
80+
```smart header="Поддержка"
81+
В данный момент `BigInt` поддерживается только в браузерах Firefox и Chrome, но не поддерживается в Safari/IE/Edge
82+
```
83+
6584
## Строка
6685

6786
Строка (`string`) в JavaScript должна быть заключена в кавычки.
@@ -198,6 +217,8 @@ typeof undefined // "undefined"
198217

199218
typeof 0 // "number"
200219

220+
typeof 10n // "bigint"
221+
201222
typeof true // "boolean"
202223

203224
typeof "foo" // "string"
@@ -226,9 +247,10 @@ typeof alert // "function" (3)
226247

227248
## Итого
228249

229-
В JavaScript есть 7 основных типов.
250+
В JavaScript есть 8 основных типов.
230251

231-
- `number` для любых чисел: целочисленных или чисел с плавающей точкой.
252+
- `number` для любых чисел: целочисленных или чисел с плавающей точкой, целочисленные значения ограничены диапазоном ±2<sup>53</sup>.
253+
- `bigint` для целых чисел произвольной длиной.
232254
- `string` для строк. Строка может содержать один или больше символов, нет отдельного символьного типа.
233255
- `boolean` для `true`/`false`.
234256
- `null` для неизвестных значений -- отдельный тип, имеющий одно значение `null`.

1-js/05-data-types/02-number/article.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
# Числа
22

3-
Все числа в JavaScript хранятся в 64-битном формате [IEEE-754](http://en.wikipedia.org/wiki/IEEE_754-1985), который также называют "числа с плавающей точкой двойной точности" (double precision floating point numbers).
3+
В современном JavaScript существует два типа чисел:
4+
1. Обычные числа в JavaScript хранятся в 64-битном формате [IEEE-754](http://en.wikipedia.org/wiki/IEEE_754-1985), который также называют "числа с плавающей точкой двойной точности" (double precision floating point numbers). Это числа, которые мы будем использовать чаще всего. Мы поговорим о них в этой главе.
5+
2. `BigInt` числа дают возможность работать с целыми числами произвольной длины. Они нужны достаточно редко, и используются в случаях, когда необходимо работать со значениями более чем <code>2<sup>53</sup></code> или менее чем <code>-2<sup>53</sup></code>. Так как `BigInt` числа нужны достаточно редко, мы рассмотрим их в отдельной главе <info:bigint>.
46

5-
Давайте глубже изучим, как работать с числами в JavaScript.
7+
В данной главе мы рассморим только первый тип чисел: числа типа `number`. Давайте глубже изучим, как с ними работать в JavaScript.
68

79
## Способы записи числа
810

@@ -407,10 +409,10 @@ alert( parseInt('2n9c', 36) ); // 123456
407409

408410
## Итого
409411

410-
Чтобы писать большие числа:
412+
Чтобы писать числа с большим количеством нулей:
411413

412-
- Используйте краткую форму записи больших чисел - `"e"`, с указанным количеством нулей. Например: `123e6` это `123` с 6-ю нулями.
413-
- Отрицательное число после `"e"` приводит к делению числа на 1 с указанным количеством нулей.
414+
- Используйте краткую форму записи чисел - `"e"`, с указанным количеством нулей. Например: `123e6` это `123` с 6-ю нулями `123000000`.
415+
- Отрицательное число после `"e"` приводит к делению числа на 1 с указанным количеством нулей. Например: `123e-6` это `0.000123` (`123` миллионная).
414416

415417
Для других систем счисления:
416418

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
# BigInt
2+
3+
[recent caniuse="bigint"]
4+
5+
`BigInt` это специальный числовой тип, который предоставляет возможность рабоать с целыми числами произвольной длины.
6+
7+
Чтобы создать значение типа `BigInt` необходимо добавить `n` в конец числового литерала или вызвать функцию `BigInt`, которая создаст `BigInt` число из переданного аргумента. Аргументом может быть число, строка и др.
8+
9+
```js
10+
const bigint = 1234567890123456789012345678901234567890n;
11+
const sameBigint = BigInt("1234567890123456789012345678901234567890");
12+
const bigintFromNumber = BigInt(10); // тоже самое что и 10n
13+
```
14+
15+
## Математические операторы
16+
17+
`BigInt` может использоваться как обычные числа, к примеру:
18+
19+
```js run
20+
alert(1n + 2n); // 3
21+
alert(5n / 2n); // 2
22+
```
23+
24+
Обратите внимание: операция деления `5/2` возвращает результат, округленный до нуля без дробной части. Все операции с числами типа `bigint` возвращают `bigint`.
25+
26+
В математических операциях мы не можем смешивать `bigint` и обычные числа:
27+
28+
```js run
29+
alert(1n + 2); // Error: Cannot mix BigInt and other types
30+
```
31+
32+
We should explicitly convert them if needed: using either `BigInt()` or `Number()`, like this:
33+
Мы должны явно их конвертировать: используя либо `BigInt()`, либо `Number()`, например:
34+
35+
```js run
36+
let bigint = 1n;
37+
let number = 2;
38+
// конвертируем number в bigint
39+
alert(bigint + BigInt(number)); // 3
40+
// конвертируем bigint в number
41+
alert(Number(bigint) + number); // 3
42+
```
43+
44+
Конвертирование bigint в число всегда происходит бесшумно, но если значение bigint слишком велико и не подходит под тип number, то дополнительные биты будут отброшены, что приведет к потере точности.
45+
46+
````smart header="К `BigInt` числам нельзя применить унарный оператор `+`"
47+
Унарный оператор `+value` является хорошо известным способом конвертировать `value` в число.
48+
Данный оператор не поддерживается при работе с `BigInt` числам, чтобы [не сломать](https://github.com/tc39/proposal-bigint/blob/master/ADVANCED.md#dont-break-asmjs) "asm.js".
49+
```js run
50+
let bigint = 1n;
51+
alert( +bigint ); // SyntaxError: Unexpected identifier
52+
```
53+
````
54+
55+
## Операции сравнения
56+
57+
Операции сравнения, такие как `<`, `>` работают с bigint и обычными числами как обычно:
58+
59+
```js run
60+
alert( 2n > 1n ); // true
61+
alert( 2n > 1 ); // true
62+
```
63+
64+
As numbers and bigints belong to different types, they can be equal `==`, but not strictly equal `===`:
65+
Так как обычные and bigint числа принадлежат к разным типам, они могут быть равны только при нестрогом сравнении `==`:
66+
67+
```js run
68+
alert( 1 == 1n ); // true
69+
alert( 1 === 1n ); // false
70+
```
71+
72+
## Логические операции
73+
74+
В `if` или любом другом логическом операторе, bigint число ведёт себя как обычное число.
75+
76+
К примеру, в `if`, bigint `0n` преобразуется в `false`, другие значения преобразуются в `true`:
77+
78+
```js run
79+
if (0n) {
80+
// никогда не выполнится
81+
}
82+
```
83+
84+
Логические операторы `||`, `&&` и другие также работают с bigint числами как с обычными числами:
85+
86+
```js run
87+
alert( 1n || 2 ); // 1
88+
alert( 0n || 2 ); // 2
89+
```
90+
91+
## Полифилы
92+
93+
Создание полифила для `BigInt` достаточно не простая задача. Причина в том, что многие операторы в JavaScript, такие как `+`, `-` и др., ведут себя по-разному с bigint числами по сравнению с обычными числами.
94+
95+
К примеру, деление bigint числа всегда возвращает целое число.
96+
97+
Чтобы эмулировать такое поведение, полифилл должен будет заменить поведение всех таких операторов. Такая реализация будет тяжеловесной и иметь негативное влияние на производительсность.
98+
99+
Вот почему на данный момент нет хорошо реализованного полифила.
100+
101+
Существует альтернативное решение предложеное разработчиками [https://github.com/GoogleChromeLabs/jsbi](JSBI) библиотеки.
102+
103+
Они предлагают использовать методы JSBI библиотеки вместо собственной реализации bigint чисел JavaScript интерпретатора:
104+
105+
| Операция | BigInt | JSBI |
106+
|-----------|-----------------|------|
107+
| Создание с `number` | `a = BigInt(789)` | `a = JSBI.BigInt(789)` |
108+
| Сложение | `c = a + b` | `c = JSBI.add(a, b)` |
109+
| Вычитание | `c = a - b` | `c = JSBI.subtract(a, b)` |
110+
| ... | ... | ... |
111+
112+
...а затем использовать "polyfill" (плагин Babel) для замены вызовов JSBI в использование нативных bigint чисел для браузеров, в которые имеется поддержка `BigInt`.
113+
114+
Другими словами, данный подход предлагает использовать JSBI вместо использования нативных bigint чисел. JSBI внутри себя работает с числами как с bigint числами с соблюдением требований спецификации. Таким образом, мы можем выполнять код в интерпретаторах, которые не поддерживают `BigInt`.
115+
116+
## References
117+
118+
- MDN: [BigInt](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/BigInt).
119+
- Спецификация: [BigInt](https://tc39.es/ecma262/#sec-bigint-objects).

0 commit comments

Comments
 (0)