You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/99-js-misc/05-bigint/article.md
+19-19Lines changed: 19 additions & 19 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,7 +7,7 @@
7
7
Чтобы создать значение типа `BigInt`, необходимо добавить `n` в конец числового литерала или вызвать функцию `BigInt`, которая создаст число типа `BigInt` из переданного аргумента. Аргументом может быть число, строка и др.
@@ -16,7 +16,7 @@ const bigintFromNumber = BigInt(10); // то же самое, что и 10n
16
16
17
17
## Математические операторы
18
18
19
-
`BigInt`может использоваться как обычные числа, к примеру:
19
+
`BigInt`можно использовать как обычные числа, к примеру:
20
20
21
21
```js run
22
22
alert(1n+2n); // 3
@@ -29,46 +29,46 @@ alert(5n / 2n); // 2
29
29
В математических операциях мы не можем смешивать `bigint` и обычные числа:
30
30
31
31
```js run
32
-
alert(1n+2); // Error: Cannot mix BigInt and other types
32
+
alert(1n+2); // Error: Cannot mix `bigint` and other types
33
33
```
34
34
35
35
Мы должны явно их конвертировать: используя либо `BigInt()`, либо `Number()`, например:
36
36
37
37
```js run
38
-
let bigint =1n;
38
+
let`bigint`=1n;
39
39
let number =2;
40
40
41
41
// конвертируем number в bigint
42
42
alert(bigint +BigInt(number)); // 3
43
43
44
-
// конвертируем bigint в number
44
+
// конвертируем `bigint` в number
45
45
alert(Number(bigint) + number); // 3
46
46
```
47
47
48
-
Конвертирование bigint в число всегда происходит неявно и без генерации ошибок, но если значение bigint слишком велико и не подходит под тип number, то дополнительные биты будут отброшены, так что следует быть осторожными с такими преобразованиями.
48
+
Конвертирование `bigint` в число всегда происходит неявно и без генерации ошибок, но если значение `bigint` слишком велико и не подходит под тип `number`, то дополнительные биты будут отброшены, так что следует быть осторожными с такими преобразованиями.
49
49
50
50
````smart header="К `BigInt` числам нельзя применить унарный оператор `+`"
51
-
Унарный оператор `+value` является хорошо известным способом конвертировать `value` в число.
51
+
Унарный оператор `+value` является хорошо известным способом конвертировать произвольное значение `value` в число.
52
52
53
-
Данный оператор не поддерживается при работе с `BigInt` числами.
53
+
Данный оператор не поддерживается при работе с `BigInt` числами.
Операции сравнения, такие как `<`, `>`, работают с bigint и обычными числами как обычно:
63
+
Операции сравнения, такие как `<`, `>`, работают с `bigint` и обычными числами как обычно:
64
64
65
65
```js run
66
66
alert( 2n > 1n ); // true
67
67
68
68
alert( 2n > 1 ); // true
69
69
```
70
70
71
-
Пожалуйста, обратите внимание, что обычные и bigint числа принадлежат к разным типам, они могут быть равны только при нестрогом сравнении `==`:
71
+
Пожалуйста, обратите внимание, что обычные и `bigint` числа принадлежат к разным типам, они могут быть равны только при нестрогом сравнении `==`:
72
72
73
73
```js run
74
74
alert( 1 == 1n ); // true
@@ -78,17 +78,17 @@ alert( 1 === 1n ); // false
78
78
79
79
## Логические операции
80
80
81
-
В `if` или любом другом логическом операторе bigint число ведёт себя как обычное число.
81
+
В `if` или любом другом логическом операторе `bigint` число ведёт себя как обычное число.
82
82
83
-
К примеру, в `if` bigint `0n` преобразуется в `false`, другие значения преобразуются в `true`:
83
+
К примеру, в `if` `bigint` `0n` преобразуется в `false`, другие значения преобразуются в `true`:
84
84
85
85
```js run
86
86
if (0n) {
87
87
// никогда не выполнится
88
88
}
89
89
```
90
90
91
-
Логические операторы `||`, `&&` и другие также работают с bigint числами как с обычными числами:
91
+
Логические операторы `||`, `&&` и другие также работают с `bigint` числами как с обычными числами:
92
92
93
93
```js run
94
94
alert( 1n || 2 ); // 1
@@ -98,19 +98,19 @@ alert( 0n || 2 ); // 2
98
98
99
99
## Полифилы
100
100
101
-
Создание полифила для `BigInt` - достаточно непростая задача. Причина в том, что многие операторы в JavaScript, такие как `+`, `-` и др., ведут себя по-разному с bigint по сравнению с обычными числами.
101
+
Создание полифила для `BigInt` - достаточно непростая задача. Причина в том, что многие операторы в JavaScript, такие как `+`, `-` и др., ведут себя по-разному с `bigint` по сравнению с обычными числами.
102
102
103
-
К примеру, деление bigint числа всегда возвращает bigint (округлённое при необходимости).
103
+
К примеру, деление `bigint` числа всегда возвращает `bigint` (округлённое при необходимости).
104
104
105
105
Чтобы эмулировать такое поведение, полифил должен будет проанализировать код и заменить все такие операторы на свои вызовы. Такая реализация будет тяжеловесной, не очень хорошей с точки зрения производительности.
106
106
107
107
Вот почему на данный момент нет хорошо реализованного полифила.
108
108
109
109
Существует обратное решение, предложеное разработчиками библиотеки [https://github.com/GoogleChromeLabs/jsbi](JSBI).
110
110
111
-
Эта библиотека реализует большие числа, используя собственные методы. Мы можем использовать их вместо встроенных bigint
111
+
Эта библиотека реализует большие числа, используя собственные методы. Мы можем использовать их вместо встроенных `BigInt`:
112
112
113
-
| Операция | Встроенный BigInt | JSBI |
113
+
| Операция | Встроенный `BigInt` | JSBI |
114
114
|-----------|-----------------|------|
115
115
| Создание из `number` | `a = BigInt(789)` | `a = JSBI.BigInt(789)` |
116
116
| Сложение | `c = a + b` | `c = JSBI.add(a, b)` |
@@ -119,7 +119,7 @@ alert( 0n || 2 ); // 2
119
119
120
120
...А затем использовать полифил (плагин Babel) для замены вызовов JSBI на встроенные `Bigint` для браузеров, которые их поддерживают.
121
121
122
-
Другими словами, данный подход предлагает использовать JSBI вместо встроенных bigint. JSBI внутри себя работает с числами как с bigint, эмулирует их с соблюдением всех требований спецификации. Таким образом, мы можем выполнять JSBI-код в интерпретаторах, которые не поддерживают `Bigint`, а для тех, которые поддерживают - полифил преобразует вызовы в обычные `Bigint`.
122
+
Другими словами, данный подход предлагает использовать JSBI вместо встроенных `BigInt`. JSBI внутри себя работает с числами как с `BigInt`, эмулирует их с соблюдением всех требований спецификации. Таким образом, мы можем выполнять JSBI-код в интерпретаторах, которые не поддерживают `Bigint`, а для тех, которые поддерживают - полифил преобразует вызовы в обычные `Bigint`.
0 commit comments