Sie sind hier 273
Typen, Gleichheit, Umwandlung und der ganze Rest
Mit NaN arbeiten
Vielleicht denken Sie jetzt, dass NaN nur selten vorkommt. Aber sobald Sie mit
Code arbeiten, der Zahlen verwendet, werden Sie überrascht sein, wie oft NaN
eine Rolle spielt. In den meisten Fällen ist das ein Test auf NaN, und nach allem,
was Sie bisher über JavaScript gelernt haben, sollte der folgende Code Ihnen
keine Probleme bereiten:
if (myNum == NaN) {
myNum = 0;
}
FALSCH!
Jeder vernünftige Mensch würde denken, dass man so überprüft, ob eine
Variable einen NaN-Wert enthält. Das funktioniert aber nicht, weil NaN einfach
»unvergleichlich« ist. Es ist nicht einmal zu sich selbst gleich. Daher ist jeder
Test auf Gleichheit mit NaN vom Tisch. Stattdessen verwendet man die spezielle
Funktion isNaN, wie hier gezeigt:
if (isNaN(myNum)) {
myNum = 0;
}
RICHTIG!
Das hier funktioniert nicht!
Nutzen Sie die Funktion isNaN,
um zu testen, ob der übergebene
Wert keine Zahl ist.
Es wird noch merkwürdiger
Lassen wir das noch ein bisschen sacken. Wenn NaN für »keine Zahl« steht, was
ist es dann? Wäre es nicht einfacher, wenn es danach benannt wäre, was es ist,
und nicht andersherum? Was, meinen Sie, ist NaN? Wir können ja mal seinen
Datentyp überprüfen:
var test11 = 0 / 0;
console.log(typeof test11);
JavaScript-Konsole
number
Wenn Sie das nicht
umhaut, sollten Sie dieses
Buch vielleicht doch
besser als Grillanzünder
verwenden.
Hier ist unsere Ausgabe.
Was zum Henker soll das? NaN hat den Datentyp »number«? Wie kann etwas,
das keine Zahl ist, eine Zahl sein? Atmen Sie tief durch und stellen Sie sich NaN
einfach als schlecht benannten Wert vor. Anstelle von »not a number« (keine
Zahl) hätte es besser »number that can't be represented« (nicht darstellbare Zahl)
heißen sollen (auch wenn das Akronym »Ntcbr« nicht halb so schön ist).
Verbuchen Sie NaN einfach als einen weiteren Punkt auf Ihrer Liste der Dinge in
der »Twilight Zone« von JavaScript.
274 Kapitel 7
Fragen zu NaN und null
F:
Ist der Rückgabewert von isNaN wahr, wenn ich einen
String übergebe, der keine Zahl ist?
A: Aber sicher! Eine Variable mit dem Wert NaN oder einem
anderen nicht numerischen Wert ergibt bei der Überprüfung mit
isNaN als Rückgabewert true (und ansonsten false). Bei der
Typumwandlung (type conversion) gibt es in diesem Zusammenhang
ein paar weitere Dinge zu beachten. Mehr dazu etwas später.
F:
Aber warum ist NaN nicht einmal zu sich selbst gleich?
A: Wirklich interessierte Menschen lesen hierzu die IEEE
Floating Point Specification. Für alle anderen gilt: NaN steht für nicht
darstellbare Zahlen. Das heißt aber nicht, dass diese Zahlen auch
gleich sein müssen. Nehmen Sie beispielsweise sqrt(-1) (Wurzel aus
-1) und sqrt(-2) (Wurzel aus -2). Die Ergebnisse sind mit Sicherheit
nicht gleich, werden aber alle als NaN dargestellt.
F:
Wenn ich 0 durch 0 dividiere, erhalte ich NaN. Beim Teilen
von 10 durch 0 bekomme ich dagegen »Infinity« (unendlich).
Gibt es da einen Unterschied zu NaN?
A: Gut bemerkt. Der Wert Infinity (oder -Infinity) steht in
JavaScript für alle Zahlen (jetzt wird es etwas technisch), die
die Obergrenze für Fließkommazahlen in einem Computer
übersteigen, also 1.7976931348623157E+10308 (oder
-1.7976931348623157E+10308 für -Infinity). Der Datentyp für Infinity
ist »number«. Wenn Sie vermuten, dass Ihre Werte ein bisschen zu
groß werden, können Sie darauf testen:
if (tamale == Infinity) {
alert("Das ist eine große Tamale!");
}
F:
Mit »NaN ist eine Zahl« haben Sie mich ziemlich
durcheinandergebracht. Kommt da noch mehr?
A:
Interessante Frage. Wie wäre es mit Infinity minus Infinity
ergibt … Achtung, Luft anhalten, Tusch! … NaN. Der Mathematiker
Ihres Vertrauens wird Ihnen gern erklären, was hier passiert!
F:
Nur der Vollständigkeit halber: Kennen wir eigentlich schon
den Datentyp von null?
A: Um das herauszufinden, übergeben Sie null am besten an
den typeof-Operator. Der Rückgabewert ist »object«, was sinnvoll ist,
wenn man bedenkt, dass null für ein nicht existentes Objekt steht.
Allerdings wird hierüber noch schwer diskutiert, und die jüngste
Spezifikation definiert für null den Datentyp null. Es kann sein, dass
Ihr Browser hier von der Spezifikation abweicht, in der Praxis werden
Sie dem Datentyp null im Code aber wohl kaum begegnen.
In diesem Kapitel haben wir ein paar interessante Werte gesehen. Als Nächstes
wollen wir uns mit interessantem Verhalten beschäftigen. Bauen Sie hierfür den unten
stehenden Code in das <script>-Element einer einfachen Webseite ein und beobachten
Sie beim Laden der Seite die Konsole. Das »Warum« werden Sie vermutlich noch nicht
verstehen, aber Sie können immerhin vermuten, was hier passiert.
if (99 == "99") {
console.log("Zahl und String sind gleich!");
} else {
console.log("Zahl und String sind grundverschieden");
}
JavaScript-Konsole
> false
Schreiben Sie hier das
Ergebnis hin:
Es gibt keine
Dummen Fragen
Übung

Get JavaScript-Programmierung von Kopf bis Fuß now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.