BigInt
je speciální číselný typ, který poskytuje podporu pro celá čísla libovolné délky.
Bigint se vytvoří připojením n
na konec celočíselného literálu nebo voláním funkce BigInt
který vytváří biginty z řetězců, čísel atd.
const bigint = 1234567890123456789012345678901234567890n;
const sameBigint = BigInt("1234567890123456789012345678901234567890");
const bigintFromNumber = BigInt(10); // same as 10n
Matematické operátory
BigInt
lze většinou použít jako běžné číslo, například:
alert(1n + 2n); // 3
alert(5n / 2n); // 2
Poznámka:divize 5/2
vrátí výsledek zaokrouhlený na nulu, bez desetinné části. Všechny operace s biginty vrací biginty.
Nemůžeme míchat biginty a běžná čísla:
alert(1n + 2); // Error: Cannot mix BigInt and other types
V případě potřeby bychom je měli explicitně převést:buď pomocí BigInt()
nebo Number()
, takto:
let bigint = 1n;
let number = 2;
// number to bigint
alert(bigint + BigInt(number)); // 3
// bigint to number
alert(Number(bigint) + number); // 3
Konverzní operace jsou vždy tiché, nikdy nezpůsobují chyby, ale pokud je bigint příliš velký a neodpovídá typu čísla, extra bity budou oříznuty, takže bychom při takovém převodu měli být opatrní.
Jednočlenné plus není podporováno na bigintech
Jednočlenný operátor plus +value
je dobře známý způsob převodu value
na číslo.
Aby nedošlo k záměně, není podporováno na bigintech:
let bigint = 1n;
alert( +bigint ); // error
Měli bychom tedy použít Number()
převést bigint na číslo.
Srovnání
Srovnání, například <
, >
dobře pracujte s biginty a čísly:
alert( 2n > 1n ); // true
alert( 2n > 1 ); // true
Upozorňujeme však, že čísla a biginty patří k různým typům, a proto se mohou rovnat ==
, ale ne přesně ===
:
alert( 1 == 1n ); // true
alert( 1 === 1n ); // false
Booleovské operace
Když jste uvnitř if
nebo jiné booleovské operace, biginty se chovají jako čísla.
Například v if
, bigint 0n
je nepravdivé, ostatní hodnoty jsou pravdivé:
if (0n) {
// never executes
}
Booleovské operátory, například ||
, &&
a další také pracují s biginty podobnými číslům:
alert( 1n || 2 ); // 1 (1n is considered truthy)
alert( 0n || 2 ); // 2 (0n is considered falsy)
Polyfills
Polyfilling bigintů je složité. Důvodem je mnoho JavaScriptových operátorů, jako je +
, -
a tak dále se chovají jinak s biginty ve srovnání s běžnými čísly.
Například rozdělení bigintů vždy vrátí bigint (v případě potřeby zaokrouhlený).
K emulaci takového chování by polyfill potřeboval analyzovat kód a nahradit všechny takové operátory svými funkcemi. Ale dělat to je těžkopádné a stálo by to hodně výkonu.
Neexistuje tedy žádný známý dobrý polyfill.
I když vývojáři knihovny JSBI navrhují opačný postup.
Tato knihovna implementuje velká čísla pomocí vlastních metod. Můžeme je použít místo nativních bigintů:
Operace | nativní BigInt | JSBI |
---|---|---|
Vytvoření z čísla | a = BigInt(789) | a = JSBI.BigInt(789) |
Dodatek | c = a + b | c = JSBI.add(a, b) |
Odčítání | c = a - b | c = JSBI.subtract(a, b) |
… | … | … |
…A pak použijte polyfill (Babel plugin) k převodu volání JSBI na nativní biginty pro ty prohlížeče, které je podporují.
Jinými slovy, tento přístup naznačuje, že píšeme kód v JSBI namísto nativních bigintů. Ale JSBI interně pracuje s čísly jako s biginty, emuluje je přesně podle specifikace, takže kód bude „připravený na bigint“.
Takový kód JSBI můžeme použít „tak jak je“ pro motory, které nepodporují biginty, a pro ty, které podporují – polyfill převede volání na nativní biginty.
Odkazy
- Dokumenty MDN na BigInt.
- Specifikace.