Der Wert «NaN» in JavaScript
«NaN» ist ein „Fluchtwert“, das heißt er hat den Typ »number« („Zahl“), aber die Bedeutung “not a number ” (also „keine Zahl“).
Wie auch schon »Infinity« und »undefined«, so ist auch »NaN« ein Eintrag des globalen Verzeichnisses »this« mit einem gleichnamigen Wert «NaN».
- Auswertung
typeof this.NaN
"number"
Der Wert «NaN» scheint zunächst widersprüchlich zu sein, da “NaN ” eine Abkürzung für “not a number ” (deutsch „keine Zahl“) darstellt, aber der Typ von «NaN» »number« (deutsch „Zahl“) ist.
Der scheinbare Widerspruch löst sich auf, wenn man bedenkt, daß den beiden Bezeichnungen zwei verschiedene Definitionen des Wortes “number ” zugrundeliegen. Das “not a number ” (deutsch „keine Zahl“) von »NaN« besagt, daß es sich nicht um eine Zahl im Sinne der Schulmathematik handelt. Der Typ »number« besagt, daß es sich um eine „Zahl“ (englisch “number ”) im Sinne des Typsystems der Programmiersprache JavaScript handelt.
Der Wert «NaN» ergibt sich bei manchen Berechnungen, für die kein anderes Ergebnis sinnvoll ist, wie in den folgenden Beispielen.
«NaN» bedeutet, daß der Wert des Ergebnisses nicht als Zahl dargestellt werden kann. Der Typ des Wertes «NaN» ist aber »number«, damit man die Typregel „number - number = number“ ohne Ausnahme gilt. (Wenn zwei Werte vom Typ »number« subtrahiert werden, ergibt sich wieder ein Wert vom Typ »number«.)
- Auswertung
this.Infinity - this.Infinity
NaN
- Auswertung
this.NaN + 1
NaN
Das folgende Beispiel zeigt, daß ein Numerale in einem String nicht mehr als Zahl interpretiert wird, wenn es mehr als ein Vorzeichen enthält.
- Auswertung
-"--65"
NaN
Das folgende Beispiel zeigt, daß ein Numerale in einem String kein Leerzeichen nach dem Vorzeichen enthalten darf.
- Auswertung
-"- 65"
NaN
Eine Rechenoperation, bei der ein Operand «undefined» ist, ergibt immer «NaN». Dies liegt daran, daß Rechenoperationen normalerweise eine Zahl ergeben, und »NaN« die Abwesenheit einer normalen Zahl kennzeichnet.
- Auswertung
1 + undefined
NaN
Die Wandlung einer nicht-numerischen Zeichenfolge in eine Zahl ergibt «NaN».
- Auswertung
+"a"
NaN
Wir können eine numerische Zeichenfolge umgekehrt dadurch definieren, daß ihre Wandlung in eine Zahl mit dem Vorzeichenoperator »+« nicht «NaN» ergibt.
Ein Vergleich einer Zahl mit einer nicht-numerischen Zeichenfolge ergibt stets «false», da ein Vergleich mit «NaN» stets «NaN» ergibt.
- Auswertung
NaN === NaN
false
- Auswertung
+'abc'
Nan
- Auswertung
2 < 'abc'
false
Metazahlen ⃗
Wir nennen »NaN« eine uneigentliche Zahl und die anderen bisher behandelten Zahlen eigentliche Zahlen. Die eigentlichen und uneigentlichen Werte fassen wir als Metazahlen zusammen.
Wir geben im folgenden die behandelten Arten von Metawerten wieder.
- Arten von Werten
- Metawerte
- uneigentliche Werte («undefined»)
- eigentliche Werte
- Fundamentalwerte
- Metazahlen
- uneigentliche Zahlen («NaN»)
- eigentliche Zahlen
- Zeichenfolgen
- Wahrheitswerte
- Verzeichnisse
Vergleiche
Der Wert «this.NaN» gilt als ungleich zu jedem Wert, einschließlich seiner selbst!
- Auswertung
this.NaN === this.NaN
false
«-this.Infinity» ist kleiner als jeder andere Zahlenwert außer «this.NaN».
- Auswertung
-this.Infinity < -1000
true
- Auswertung
-this.Infinity < this.NaN
false
Auch nach Vertauschung der Operanden ergibt sich »false«. Vielleicht wäre hier das Ergebnis »undefined« sinnvoller, jedoch soll ein Vergleich anscheinend immer einen Wahrheitswert ergeben.
- Auswertung
this.NaN < -this.Infinity
false
Bei einem Vergleich einer Zeichenfolge mit einer Metazahl wird die Zeichenfolge in eine Metazahl gewandelt. Eine Zeichenfolge wie »!«, die nicht als Numerale interpretiert werden kann, wird dabei in «this.NaN» gewandelt.
- Auswertung
"!" < 1
false
- Auswertung
1 < "!"
false
Übersicht
In der folgenden Übersicht steht »this« für das globale Verzeichnis.
- Übersicht der Namen
Name Art Bedeutung
this.Infinity Zahl Unendlich
this.Math.PI Zahl die Kreiszahl Pi
this.undefined Wert "kein Wert"
this.NaN Zahl "keine Zahl"
Übungsfragen
? Übungsfragen
Warum ergibt der folgende Vergleich »true«?
- Ausdruck
this.Math.NaN === this.Math.NaN
true