BigInt â ÑÑо ÑпеÑиалÑнÑй ÑиÑловой Ñип, коÑоÑÑй пÑедоÑÑавлÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑабоÑаÑÑ Ñ ÑелÑми ÑиÑлами пÑоизволÑной длинÑ.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð·Ð½Ð°Ñение Ñипа BigInt, необÑ
одимо добавиÑÑ n в ÐºÐ¾Ð½ÐµÑ ÑиÑлового лиÑеÑала или вÑзваÑÑ ÑÑнкÑÐ¸Ñ BigInt, коÑоÑÐ°Ñ ÑоздаÑÑ ÑиÑло Ñипа BigInt из пеÑеданного аÑгÑменÑа. ÐÑгÑменÑом Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑиÑло, ÑÑÑока и дÑ.
const bigint = 1234567890123456789012345678901234567890n;
const sameBigint = BigInt("1234567890123456789012345678901234567890");
const bigintFromNumber = BigInt(10); // Ñо же Ñамое, ÑÑо и 10n
ÐаÑемаÑиÑеÑкие опеÑаÑоÑÑ
BigInt можно иÑполÑзоваÑÑ ÐºÐ°Ðº обÑÑнÑе ÑиÑла, к пÑимеÑÑ:
alert(1n + 2n); // 3
alert(5n / 2n); // 2
ÐбÑаÑиÑе внимание: опеÑаÑÐ¸Ñ Ð´ÐµÐ»ÐµÐ½Ð¸Ñ 5/2 возвÑаÑÐ°ÐµÑ Ð¾ÐºÑÑглÑннÑй ÑезÑлÑÑаÑ, без дÑобной ÑаÑÑи. ÐÑе опеÑаÑии Ñ ÑиÑлами Ñипа bigint возвÑаÑаÑÑ bigint.
РмаÑемаÑиÑеÑкиÑ
опеÑаÑиÑÑ
Ð¼Ñ Ð½Ðµ можем ÑмеÑиваÑÑ bigint и обÑÑнÑе ÑиÑла:
alert(1n + 2); // Error: Cannot mix BigInt and other types
ÐÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ñвно иÑ
конвеÑÑиÑоваÑÑ: иÑполÑзÑÑ Ð»Ð¸Ð±Ð¾ BigInt(), либо Number(), напÑимеÑ:
let bigint = 1n;
let number = 2;
// конвеÑÑиÑÑем number в bigint
alert(bigint + BigInt(number)); // 3
// конвеÑÑиÑÑем `bigint` в number
alert(Number(bigint) + number); // 3
ÐонвеÑÑиÑование bigint в ÑиÑло вÑегда пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð½ÐµÑвно и без генеÑаÑии оÑибок, но еÑли знаÑение bigint ÑлиÑком велико и не подÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾Ð´ Ñип number, Ñо дополниÑелÑнÑе биÑÑ Ð±ÑдÑÑ Ð¾ÑбÑоÑенÑ, Ñак ÑÑо ÑледÑÐµÑ Ð±ÑÑÑ Ð¾ÑÑоÑожнÑми Ñ Ñакими пÑеобÑазованиÑми.
BigInt ÑиÑлам нелÑÐ·Ñ Ð¿ÑимениÑÑ ÑнаÑнÑй опеÑаÑÐ¾Ñ +УнаÑнÑй опеÑаÑÐ¾Ñ +value ÑвлÑеÑÑÑ Ñ
оÑоÑо извеÑÑнÑм ÑпоÑобом конвеÑÑиÑоваÑÑ Ð¿ÑоизволÑное знаÑение value в ÑиÑло.
ÐаннÑй опеÑаÑÐ¾Ñ Ð½Ðµ поддеÑживаеÑÑÑ Ð¿Ñи ÑабоÑе Ñ BigInt ÑиÑлами:
let bigint = 1n;
alert( +bigint ); // ÐÑибка!
ÐÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸ÑполÑзоваÑÑ Number() Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ bigint к number.
ÐпеÑаÑии ÑÑавнениÑ
ÐпеÑаÑии ÑÑавнениÑ, Ñакие как <, >, ÑабоÑаÑÑ Ñ bigint и обÑÑнÑми ÑиÑлами как обÑÑно:
alert( 2n > 1n ); // true
alert( 2n > 1 ); // true
ÐожалÑйÑÑа, обÑаÑиÑе внимание, ÑÑо обÑÑнÑе и bigint ÑиÑла пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ Ðº ÑазнÑм Ñипам, они могÑÑ Ð±ÑÑÑ ÑÐ°Ð²Ð½Ñ ÑолÑко пÑи неÑÑÑогом ÑÑавнении ==:
alert( 1 == 1n ); // true
alert( 1 === 1n ); // false
ÐогиÑеÑкие опеÑаÑии
Ð if или лÑбом дÑÑгом логиÑеÑком опеÑаÑоÑе bigint ÑиÑло ведÑÑ ÑÐµÐ±Ñ ÐºÐ°Ðº обÑÑное ÑиÑло.
РпÑимеÑÑ, в if bigint 0n пÑеобÑазÑеÑÑÑ Ð² false, дÑÑгие знаÑÐµÐ½Ð¸Ñ Ð¿ÑеобÑазÑÑÑÑÑ Ð² true:
if (0n) {
// никогда не вÑполниÑÑÑ
}
ÐогиÑеÑкие опеÑаÑоÑÑ ||, && и дÑÑгие Ñакже ÑабоÑаÑÑ Ñ bigint ÑиÑлами как Ñ Ð¾Ð±ÑÑнÑми ÑиÑлами:
alert( 1n || 2 ); // 1
alert( 0n || 2 ); // 2
ÐолиÑилÑ
Создание полиÑила Ð´Ð»Ñ BigInt â доÑÑаÑоÑно непÑоÑÑÐ°Ñ Ð·Ð°Ð´Ð°Ñа. ÐÑиÑина в Ñом, ÑÑо многие опеÑаÑоÑÑ Ð² JavaScript, Ñакие как +, - и дÑ., ведÑÑ ÑÐµÐ±Ñ Ð¿Ð¾-ÑÐ°Ð·Ð½Ð¾Ð¼Ñ Ñ bigint по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¾Ð±ÑÑнÑми ÑиÑлами.
РпÑимеÑÑ, деление bigint ÑиÑла вÑегда возвÑаÑÐ°ÐµÑ bigint (окÑÑглÑнное пÑи необÑ
одимоÑÑи).
ЧÑÐ¾Ð±Ñ ÑмÑлиÑоваÑÑ Ñакое поведение, полиÑил должен бÑÐ´ÐµÑ Ð¿ÑоанализиÑоваÑÑ ÐºÐ¾Ð´ и замениÑÑ Ð²Ñе Ñакие опеÑаÑоÑÑ Ð½Ð° Ñвои вÑзовÑ. Ð¢Ð°ÐºÐ°Ñ ÑеализаÑÐ¸Ñ Ð±ÑÐ´ÐµÑ ÑÑжеловеÑной, не оÑÐµÐ½Ñ Ñ Ð¾ÑоÑей Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Ð¿ÑоизводиÑелÑноÑÑи.
ÐÐ¾Ñ Ð¿Ð¾ÑÐµÐ¼Ñ Ð½Ð° даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½ÐµÑ Ñ Ð¾ÑоÑо Ñеализованного полиÑила.
СÑÑеÑÑвÑÐµÑ Ð¾Ð±ÑаÑное ÑеÑение, пÑедложеное ÑазÑабоÑÑиками библиоÑеки JSBI.
ÐÑа библиоÑека ÑеализÑÐµÑ Ð±Ð¾Ð»ÑÑие ÑиÑла, иÑполÑзÑÑ ÑобÑÑвеннÑе меÑодÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð¸Ñ
вмеÑÑо вÑÑÑоеннÑÑ
BigInt:
| ÐпеÑаÑÐ¸Ñ | ÐÑÑÑоеннÑй BigInt |
JSBI |
|---|---|---|
Создание из number |
a = BigInt(789) |
a = JSBI.BigInt(789) |
| Сложение | c = a + b |
c = JSBI.add(a, b) |
| ÐÑÑиÑание | c = a - b |
c = JSBI.subtract(a, b) |
| ⦠| ⦠| ⦠|
â¦Ð заÑем иÑполÑзоваÑÑ Ð¿Ð¾Ð»Ð¸Ñил (плагин Babel) Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ Ð²Ñзовов JSBI на вÑÑÑоеннÑе Bigint Ð´Ð»Ñ Ð±ÑаÑзеÑов, коÑоÑÑе иÑ
поддеÑживаÑÑ.
ÐÑÑгими Ñловами, даннÑй подÑ
од пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ð¸ÑполÑзоваÑÑ JSBI вмеÑÑо вÑÑÑоеннÑÑ
BigInt. JSBI внÑÑÑи ÑÐµÐ±Ñ ÑабоÑÐ°ÐµÑ Ñ ÑиÑлами как Ñ BigInt, ÑмÑлиÑÑÐµÑ Ð¸Ñ
Ñ ÑоблÑдением вÑеÑ
ÑÑебований ÑпеÑиÑикаÑии. Таким обÑазом, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑполнÑÑÑ JSBI-код в инÑеÑпÑеÑаÑоÑаÑ
, коÑоÑÑе не поддеÑживаÑÑ Bigint, а Ð´Ð»Ñ ÑеÑ
, коÑоÑÑе поддеÑживаÑÑ â полиÑил пÑеобÑазÑÐµÑ Ð²ÑÐ·Ð¾Ð²Ñ Ð² обÑÑнÑе Bigint.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)