BigInt

Nedávný přírůstek Toto je nedávný přírůstek do jazyka. Aktuální stav podpory najdete na https://caniuse.com/#feat=bigint.

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.