JavaScript/Objekte/Number

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

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.

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.

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.

Beispiel
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.
Schreibweise von Literalen für numerischer Werte
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