JavaScript/Objekte/Number
Unter dem Begriff Number versteht man in JavaScript dreierlei – zum einen den primitiven Datentyp für Zahlenwerte, zum zweiten eine Funktion, die beliebige Werte in Zahlenwerte konvertiert und zum dritten ein vordefiniertes Objekt, das dazu da ist, Zahlenwerte als Objekt zu kapseln. Diese Bedeutungen müssen genau unterschieden werden.
Der JavaScript-Programmierer verwendet im Normalfall immer den primitiven Datentyp. Das Number-Objekt existiert in JavaScript vor allem als Funktion, die Werte in Zahlen konvertieren kann, und um Zahlen bei Bedarf wie Objekte zu behandeln und die Methoden von Number.prototype
anwenden zu können.
Da dieser Artikel auch unter dem Thema Datentypen verlinkt ist, soll auch auf Zahlenwerte in JavaScript eingegangen werden.
Inhaltsverzeichnis
Das Number Objekt
Über das Objekt Number
haben Sie Zugriff auf Eigenschaften numerischer Werte. So können Sie ermitteln, ob ein Wert eine gültige Zahl darstellt oder welches die maximale positive oder negative Zahl ist, die in einer numerischen Variablen gespeichert werden kann.
Eigenschaften des Number
-Objekts können Sie direkt ansprechen, indem Sie Number
davor notieren.
Eigenschaften von Number
Methoden von Number:
Methoden von Number.prototype:
Globale Funktionen zum Prüfen von Number-Werten und zum Umwandeln von Werten in Number-Werte
Number() als Funktion
Die Verwendung von Number()
als Funktion konvertiert beliebige Werte in primitive numerische Werte. Sofern man einen primitiven Wert übergibt, greifen einige Standardregeln:
- Number(undefined) ergibt NaN
- Number(null) ergibt 0
- Number(false) ergibt 0
- Number(true) ergibt 1
- Number(string) fasst den String als Literal eines Zahlenwertes auf (siehe unten), wobei es nicht festgelegt ist, ob eine führende Null zu einer Interpretation als Oktalzahl führt. Das Problem der möglichen Oktalzahl lässt sich besser mit parseInt() behandeln.
Übergibt man ein Objekt an die Number
-Funktion, versucht JavaScript die valueOf-Methode des Objekts zu verwenden, um einen primitiven Wert zu erhalten. Erfüllt valueOf()
diese Aufgabe nicht, gibt Number()
den speziellen Wert NaN
zurück.
Number() als Konstruktor
Es ist nicht gebräuchlich, aber möglich, mit new Number(wert)
ein Number-Objekt explizit zu erzeugen. Solche Objekte verhalten sich in arithmetischen Ausdrücken wie Zahlen, weil JavaScript implizit durch Aufruf der valueOf()-Methode den primitiven Wert herausholt, und JavaScript erkennt automatisch, wenn für einen primitiven number-Wert ein Methodenaufruf stattfinden soll, und erzeugt dann für die Dauer dieses Aufrufs ein temporäres Number-Objekt.
Sie können solchen Objekten zusätzliche Eigenschaften zuweisen, Sie können auf diese Weise auch von Number
abgeleitete Klassen erzeugen, aber für den Normalgebrauch ist dieses Vorgehen nicht zu empfehlen. Es kann sogar zu Verwirrung führen, weil new Number(0)
bei einer Konvertierung nach Boolean als truthy interpretiert wird, der primitive number-Wert 0 aber als falsy.
Anwenden von Number-Methoden auf Zahlenliterale
Sie können die Methoden von Number.prototype
auch auf Zahlenliterale anwenden. Allerdings müssen Sie bei Zahlenliteralen zur Basis 10, die keine Nachkommastellen haben, das Literal in Klammern setzen, weil JavaScript sonst den Punkt des Methodenaufrufs mit dem Dezimalpunkt verwechselt.
console.log(12.4711.toFixed(2)); // funktioniert
console.log(12.toFixed(2)); // funktioniert NICHT
console.log((12).toFixed(2)); // funktioniert
console.log(0x17.toString(10)); // Hex-Literal - funktioniert
console.log(1e9.toFixed(1)); // Exponential-Literal - funktioniert auch ohne Dezimalpunkt
Zahlenwerte
Zahlenwerte können in JavaScript auf unterschiedliche Art notiert werden. Es gibt
- Ganze Zahlen (integer) im üblichen Zehnersystem, notiert als eine Ziffernfolge. Für negative Zahlen stellt man ein Minuszeichen voran.
- Ganze Zahlen als Hexadezimalzahl, notiert durch ein Präfix 0x und eine Folge aus Hexadezimalziffern 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f. Statt der Kleinbuchstaben können auch Großbuchstaben verwendet werden.
- Ganze Zahlen als Oktalzahl, notiert durch eine 0 als erste Ziffer und eine Folge aus Oktalziffern 0,1,2,3,4,5,6,7. Diese Darstellung wird nicht von allen JavaScript-Interpretern unterstützt, es ist daher ratsam, auf Oktalzahlen ganz zu verzichten. Im strengen Modus führt die Verwendung einer Oktaldarstellung sogar zu einem Programmabbruch. Es gibt noch einige Bereiche, wo sie genutzt werden, dazu mehr in der Wikipedia
- Fließkommazahlen (float), notiert als eine Folge aus Ziffern mit einem Punkt dazwischen, der die Rolle des Dezimalkommas übernimmt. Auch hier ist ein vorangestelltes Minuszeichen möglich
- Exponentialzahlen, notiert als Fließkommazahl mit einem angefügten Exponententeil, bestehend aus einem e oder E, einem optionalen Minuszeichen für negative Exponenten und dem Wert des Exponenten. Die Fließkommazahl vor dem e wird durch den Exponententeil mit 10 hoch (exponentenwert) multipliziert.
- BigInt-Zahlen, eine in ECMAScript 2020 standardisierte Erweiterung von JavaScript, um ganze Zahlen beliebiger Länge darstellen zu können. Diese Zahlen bilden aber einen eigenen primitiven Wertetyp und haben eine eigene interne Darstellung. Es gibt keine implizite Konvertierung von oder nach BigInt, deshalb dürfen sie Ausdrücken nicht mit Number-Werten gemischt werden, man muss einen der beiden Typen vorher konvertieren. Bitte lesen Sie dazu den BigInt-Artikel.
const i1 = 0, // Integer-Werte
i2 = 4711,
i3 = -1000000;
const h1 = 0x0, // Hexadezimale Literale für Integer-Werte
h2 = 0xdeadbeef,
h3 = -0x1234;
const o1 = 0111; // Ein Oktalwert, entspricht dezimal 73
// Programmabbruch im strict mode!
const f1 = 1.234,
f2 = -47.11,
f3 = 1E100, // Ein Googol (10¹⁰⁰)
f4 = 31415.926E-4; // π in Verkleidung
// 10⁵⁰, diesmal als BigInt-Literal
const b1 = 100000000000000000000000000000000000000000000000000n;
Fließkommazahlen werden für die Ausgabe auf eine Stelle vor dem Komma standardisiert, für f4 erhielte man das Ergebnis "3.1415926".
Trotz dieser unterschiedlichen Schreibmöglichkeiten wird jeder numerische Wert von JavaScript nach IEEE 754 als 64-bit Fließkommazahl mit Exponent gespeichert, ganz gleich, ob es ein Integerwert ist oder nicht. Das IEEE 754 Format ermöglicht die fehlerfreie Darstellung von Ganzzahlen im Bereich von -9007199254740992 bis +9007199254740992 (253). Insgesamt sind Zahlenbeträge bis 1.7976931348623157 E+308 darstellbar. Die kleinste Zahl größer als Null, die nach IEEE 754 gespeichert werden kann, ist 5E-324 (5⋅10-324).
Das Problem bei Fließkommazahlen ist, dass sie in den meisten Fällen einen gerundeten Wert darstellen, und dass die Anzahl der signifikanten Ziffern auf ca. 16 begrenzt ist (52 Binärstellen). Hinzu kommt, dass Zahlen im Exponentialformat zwar zur Basis 10 aufgeschrieben werden, aber der Exponent, der intern verwendet wird, ist zur Basis 2. Deswegen ist beispielsweise die Dezimalzahl 0.1, die wir im Exponentialsformat als 1E-1 schreiben könnten, im IEEE 754 Speicherformat eine periodische Binärzahl, weil sich 10-1 nicht als Zweierpotenz darstellen lässt. Deshalb muss der Prozessor sie runden, und der Vergleich 100.1 - 100 == 0.1
liefert das Ergebnis false. Das ist kein Fehler von JavaScript, sondern eine Eigenschaft von Fließkommazahlen, die in das IEEE 754 Format eingebaut ist. Ausführliche Informationen finden Sie im Wiki-Artikel Rechnerarithmetik.
Weblinks
- ECMA-Script Spezifikation: Number Objects
- MDN Web Docs: