Читать книгу JavaScript – Das Handbuch für die Praxis - David Flanagan - Страница 37
3.2.5Langzahlarithmetik mit BigInt
ОглавлениеEines der neuesten JavaScript-Features, definiert in ES2020, ist ein neuer numerischer Typ, bekannt als BigInt. Anfang 2020 war BigInt in Chrome, Firefox, Edge und Node implementiert. Die Umsetzung in Safari war zu diesem Zeitpunkt noch nicht abgeschlossen. Wie der Name schon sagt, ist BigInt ein numerischer Datentyp, dessen Werte Ganzzahlen sind. Dieser Typ wurde JavaScript hauptsächlich hinzugefügt, um die Darstellung von 64-Bit-Ganzzahlen zu ermöglichen, die für die Kompatibilität mit vielen anderen Programmiersprachen und APIs erforderlich sind. BigInt-Werte können Tausende oder sogar Millionen von Ziffern haben, sollten Sie mit so großen Zahlen arbeiten müssen. (Bitte beachten Sie, dass BigInt-Implementierungen nicht für Kryptografie geeignet sind, da sie nicht versuchen, Rechenzeitangriffe zu verhindern.)
BigInt-Literale werden als Zeichenketten aus Ziffern geschrieben, gefolgt von einem Kleinbuchstaben n. Standardmäßig beziehen sie sich auf die Basis 10. Sie können die Präfixe 0b, 0o und 0x für binäre, oktale und hexadezimale BigInts verwenden:
1234n // Ein nicht so großes BigInt-Literal.
0b111111n // Ein binäres BigInt.
0o7777n // Ein oktales BigInt.
0x8000000000000000n // => 2n**63n: Eine 64-Bit-Ganzzahl.
Sie können BigInt() als Funktion verwenden, um reguläre JavaScript-Zahlen oder -Strings in BigInt-Werte zu konvertieren:
BigInt(Number.MAX_SAFE_INTEGER) // => 9007199254740991n
let string = "1" + "0".repeat(100); // 1 gefolgt von 100 Nullen.
BigInt(string) // => 10n**100n: Ein Googol.
Die Arithmetik mit BigInt-Werten funktioniert wie die Arithmetik mit regulären JavaScript-Zahlen, abgesehen davon, dass bei Divisionen der Rest abgeschnitten und abgerundet wird (also Richtung null):
1000n + 2000n // => 3000n
3000n - 2000n // => 1000n
2000n * 3000n // => 6000000n
3000n / 997n // => 3n: Der Quotient ist 3.
3000n % 997n // => 9n: Der Rest ist 9.
(2n ** 131071n) - 1n // Eine Mersenne-Primzahl mit 39.457 Dezimalstellen.
Obwohl die Standardoperatoren +, -, *, /, % und ** mit BigInt arbeiten, muss man beachten, dass Operanden des Typs BigInt nicht mit regulären Zahlen als Operanden gemischt werden dürfen. Dies mag zunächst verwirrend erscheinen, aber es gibt einen guten Grund dafür. Wäre ein numerischer Typ allgemeiner als der andere, könnte man die Arithmetik auf gemischten Operanden so definieren, dass einfach ein Wert des allgemeineren Typs zurückgegeben wird. Aber keiner der beiden Typen ist allgemeiner als der andere: BigInt kann außerordentlich große Werte darstellen, was diesen Datentyp allgemeiner macht als normale Zahlen. BigInt kann jedoch nur ganze Zahlen darstellen, was wiederum den regulären JavaScript-Typ Number zum allgemeineren macht. Das Problem lässt sich nicht so einfach lösen, sodass JavaScript es stattdessen vermeidet, indem es einfach verbietet, bei arithmetischen Operationen gemischte Operanden zu benutzen.
Vergleichsoperatoren hingegen funktionieren mit gemischten numerischen Typen (siehe aber 3.9.1 wegen des Unterschieds zwischen == und ===):
1 < 2n // => true
2 > 1n // => true
0 == 0n // => true
0 === 0n // => false: Der Operator === überprüft auch die Typgleichheit.
Die bitweisen Operatoren (beschrieben in 4.8.3) arbeiten in der Regel mit BigInt-Operanden. Allerdings akzeptiert keine der Funktionen des Math-Objekts BigInt-Operanden.