JavaScript/Objekte/BigInt
Inhaltsverzeichnis
Der JavaScript-Datentyp BigInt ist dafür vorgesehen, ganze Zahlen mit beliebiger Größe zu verarbeiten. Das Limit ist der verfügbare Speicherplatz des Computers, bzw. das Limit, das Ihr Browser bereit ist, an Speicherplatz bereitzustellen. Zahlen mit mehreren Millionen an Stellen sind möglich, Sie müssen aber davon ausgehen, dass Rechnungen mit solchen Werten viel Zeit beanspruchen.
Erzeugen von BigInt-Werten
Die eingebaute JavaScript-Funktion BigInt dient zur Konvertierung von ganzzahligen Number-Werten in BigInt-Werte. Alternativ gibt es die Möglichkeit, BigInt-Werte als Literal zu schreiben, dazu fügen Sie an die Ziffern des BigInt-Wertes ein n an.
// 50-stellige BigInt Zahlen, die sich um 1 unterscheiden
const b1 = 12345678901234567890123456789012345678901234567890n;
const b2 = 12345678901234567890123456789012345678901234567891n;
console.log(b2 - b1); // Es wird korrekt 1 ausgegeben
Dieses Experiment würde mit normalen Number-Werten nicht gelingen, die größte verarbeitbare Number-Zahl findet sich in Number.MAX_SAFE_INTEGER, das ist 900 7199 254 740 991. Ohne BigInt-Literale müssten Sie die in b1 abgelegte Konstante mühsam aus höchsten 15-stelligen Zeilen zusammensetzen:
// Aufteilen in Gruppen: 12345 678901234567890 123456789012345 678901234567890n;
const b3_1 = BigInt( 12345);
const b3_2 = BigInt(678901234567890);
const b3_3 = BigInt(123456789012345);
const b3_4 = BigInt(678901234567890);
const factor = BigInt(1000000000000000); // 10**15
const b3 = ((b3_1 * factor + b3_2) * factor + b3_3) * factor + b3_4;
console.log(b2 - b1); // Hoffentlich 1
Operationen mit BigInt-Werten
Viele JavaScript-Operatoren unterstützen BigInt-Werte. Verwendbar sind:
- die arithmetischen Operatoren
+,-,*,/,%und** - die Vergleichsoperatoren
==,===,!=,!==,<,<=,>und> - Die Bitoperatoren
|,&,<<,>>und^ - Konvertierungen mit Object(), Boolean(), Number() und String()
- 0n gilt als falsy
Einige Dinge gehen aber nicht.
- Um nicht versehentlich Genauigkeit zu verlieren, gibt es keine automatische Typwandlung von BigInt zu Number. Sie können deshalb keine Ausdrücke mit Arithmetik- oder Bitoperatoren erstellen, die Number- und BigInt-Werte mischen. Ein Vergleich von Number- und BigInt-Werten ist dagegen möglich
- Wenn Sie einen BigInt-Wert als Array-Index verwenden, muss er zwischen 0 und (232-1) liegen (also einem UInt32-Wert entsprechen), um als numerischer Index akzeptiert zu werden und auf die
length-Eigenschaft des Arrays Einfluss zu haben. Andere Werte werden in eine Zeichenkette konvertiert und dem Array-Objekt als normale Eigenschaft hinzugefügt. - Der unäre
+-Operator kann für BigInt-Werte nicht verwendet werden. Für diesen Operator ist spezifiziert, dass er einen Number-Wert erzeugt. Die Spezifikation von asm.js verlässt sich darauf und würde verletzt, wenn in der Variablen a ein BigInt Wert stünde und+aein BigInt liefert. - Der Bit-Operator
>>>(vorzeichenlose Verschiebung nach rechts) ist unzulässig, weil BitInt-Werte grundsätzlich vorzeichenbehaftet sind.
Referenz
Bei BigInt-Werten handelt es sich nicht um Objekte, sondern um primitive Werte. Die Verwendung der BigInt-Funktion als Konstruktor, d. h. zusammen mit dem new-Operator, ist nicht erlaubt. Es gibt aber - analog zu den anderen primitiven Typen - Methoden der BigInt-Funktion und auch ein BigInt.prototype-Objekt, dessen Methoden von BigInt-Werten verwendet werden können.
Methoden von BigInt
Methoden von BigInt.prototype
Die Links verweisen auf die Number-Dokumentation, die Funktionalität ist identisch.