BigInt je speciálnà ÄÃselný typ, který poskytuje podporu celých ÄÃsel libovolné délky.
ÄÃslo typu BigInt se vytvoÅà pÅidánÃm pÃsmene n na konec celoÄÃselného literálu nebo volánÃm funkce BigInt, která vytváÅà biginty z ÅetÄzců, ÄÃsel a podobnÄ.
const bigint = 1234567890123456789012345678901234567890n;
const stejnýBigint = BigInt("1234567890123456789012345678901234567890");
const bigintZÄÃsla = BigInt(10); // totéž jako 10n
Matematické operátory
BigInt lze vÄtÅ¡inou použÃvat jako obvyklé ÄÃslo, napÅÃklad:
alert(1n + 2n); // 3
alert(5n / 2n); // 2
ProsÃme vÅ¡imnÄte si: dÄlenà 5/2 vracà výsledek zaokrouhlený smÄrem k nule, bez desetinné Äásti. VÅ¡echny operace na bigintech vracejà biginty.
Nemůžeme smÄÅ¡ovat biginty a bÄžná ÄÃsla:
alert(1n + 2); // Chyba: Nelze mÃchat dohromady BigInt a jiné typy
Když je potÅeba, mÄli bychom je explicitnÄ konvertovat použitÃm buÄ BigInt(), nebo Number(), napÅÃklad:
let bigint = 1n;
let ÄÃslo = 2;
// ÄÃslo na bigint
alert(bigint + BigInt(ÄÃslo)); // 3
// bigint na ÄÃslo
alert(Number(bigint) + ÄÃslo); // 3
Konverznà operace jsou vždy tiché a nikdy neohlásà chybu, ale je-li bigint pÅÃliÅ¡ velký a nevejde se do ÄÃselného typu, budou pÅebývajÃcà bity odÅÃznuty, takže bychom pÅi takové konverzi mÄli být opatrnÃ.
Operátor unárnÃho plusu +hodnota je dobÅe známý způsob, jak pÅevést hodnotu hodnota na ÄÃslo.
Aby nedocházelo ke zmatkům, biginty jej nepodporujÃ:
let bigint = 1n;
alert( +bigint ); // chyba
Ke konverzi bigintu na ÄÃslo bychom tedy mÄli použÃvat Number().
PorovnávánÃ
PorovnávánÃ, napÅ. <, >, fungujà s biginty a ÄÃsly správnÄ:
alert( 2n > 1n ); // true
alert( 2n > 1 ); // true
ProsÃme vÅ¡imnÄte si vÅ¡ak, že protože ÄÃsla a biginty patÅà k různým typům, mohou si být rovny ==, ale ne striktnÄ rovny ===:
alert( 1 == 1n ); // true
alert( 1 === 1n ); // false
Booleovské operace
Když jsme uvnitÅ if nebo jiných booleovských operacÃ, biginty se chovajà jako ÄÃsla.
NapÅÃklad v if je bigint 0n nepravdivý, ostatnà hodnoty jsou pravdivé:
if (0n) {
// nikdy se nespustÃ
}
RovnÄž booleovské operátory, napÅ. ||, && a jiné, fungujà s biginty obdobnÄ jako s ÄÃsly:
alert( 1n || 2 ); // 1 (1n se považuje za pravdivé)
alert( 0n || 2 ); // 2 (0n se považuje za nepravdivé)
Polyfilly
Polyfillovánà bigintů je problematické. PÅÃÄinou je, že mnoho JavaScriptových operátorů, napÅ. +, - a podobnÄ, se chová na bigintech odliÅ¡nÄ oproti bÄžným ÄÃslům.
NapÅÃklad dÄlenà bigintů vrátà vždy bigint (zaokrouhlený, je-li to nutné).
Aby polyfill mohl takové chovánà emulovat, musel by analyzovat kód a nahradit vÅ¡echny takové operátory svými funkcemi. Provést nÄco takového je vÅ¡ak tÄžkopádné a znaÄnÄ by to snÞilo výkon.
Dosud tedy nenà dobÅe znám žádný dobrý polyfill.
Jinou cestiÄku kolem bigintů vÅ¡ak nabÃzejà vývojáÅi knihovny JSBI.
Tato knihovna implementuje velká ÄÃsla svými vlastnÃmi metodami. Můžeme je použÃvat mÃsto nativnÃch bigintů:
| Operace | Nativnà BigInt |
JSBI |
|---|---|---|
| VytvoÅenà z ÄÃsla | a = BigInt(789) |
a = JSBI.BigInt(789) |
| SÄÃtánà | c = a + b |
c = JSBI.add(a, b) |
| OdÄÃtánà | c = a - b |
c = JSBI.subtract(a, b) |
| ⦠| ⦠| ⦠|
â¦A pak použÃt polyfill (zásuvný modul Babel) ke konverzi volánà JSBI na nativnà biginty pro prohlÞeÄe, které je podporujÃ.
Jinými slovy, tento pÅÃstup nám navrhuje, abychom mÃsto použÃvánà nativnÃch bigintů psali kód v JSBI. AvÅ¡ak JSBI vnitÅnÄ pracuje s ÄÃsly jako s biginty a emuluje je způsobem blÃzkým specifikaci, takže kód bude âpÅipraven pro bigintyâ.
Takový kód s JSBI můžeme použÃvat beze zmÄny na motorech, které biginty nepodporujÃ, i na tÄch, které je podporujà â polyfill bude konvertovat volánà na nativnà biginty.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)