Hallo,
diese liste habe ich mir auch durchgelesen, aber bei so dingen wie -0, +0, -unendlich und +unendlich gingen mir die verständnismöglichkeiten aus. ich nehme mal an, (man verzeih mir meine unfachmännische/falsche ausdrucksweise) das hat was mit den bits ganz am boden der werte zu tun, so in der art? und: was unterscheidet +0/unendlich von -0/unendlich? auf solche fragen selbstständig laiengerechte antworten zu finden ist wirklich sehr schwer... sry!
Das hängt mit Floating-Point-Arithmetik zusammen. Eine Floating-Point-Zahl im Computer setzt sich aus 3 Dingen zusammen:
- Einem Bit für's Vorzeichen
- Der Mantisse
- Dem Exponenten
Mathematisch ist eine Floating-Point-Zahl so zu lesen:
(-1)^Vorzeichen * Mantisse * 2^Exponent
Wenn man von Details wie der genauen Kodierung mal absieht ergeben sich +/-0, +/-unendlich und NaN aus folgender Überlegung:
-
+/-0 ist einfach eine Notwendigkeit auf Grund der Tatsache, dass es ein Vorzeichenbit gibt. Im Gegensatz zu Ganzzahlen, die fast immer im Zweierkomplement dargestellt werden, kann man hier kein Zweierkomplement nutzen und muss daher ein Extra-Vorzeichenbit haben. Da Zahl ohne Bit gesetzt = - Zahl mit Bit gesetzt sein sollte (wenn man nicht komplett am Rad drehen will ;-)), gibt es eben zu +0 ein -0 als Äquivalent. Die Vergleichsregeln von eigentlich allen Programmiersprachen sagen jedoch, dass +0 == -0 ist, siehe auch die Regeln für JS.
-
NaN ergibt soch aus unbestimmten Ausdrücken: 0/0 z.B. ist NaN, genauso wie die Versuchte Umwandlung vom String "abc" in ein Float. NaN steht für Not a Number und wird durch ein bestimmtes festgelegtes Bitmuster kodiert.
-
+/-unendlich zeigen Überläufe an. Es gibt auch bei Floats eine größte darstellbare Zahl und wenn Du eine Operation durchführst, die über diese Zahl hinausgeht, dann wird durch +unendlich der Überlauf gekennzeichnet, den kann man damit auch abfangen.
NaN, +/-unendlich und +/-0 spielen auch noch auf verschiedene Arten zusammen, was die Nützlichkeit nochmal erhöht, worauf ich hier aber nicht genauer eingehen will.
Wenn Dich näheres zu FP-Arithemtik interessiert: http://docs.sun.com/source/806-3568/ncg_goldberg.html (Achtung: Langes, teilweise etwas schwer zu verdauendes Dokument, aber sehr informativ)
[1] typeof liefert nicht immer den internen Typ zurück!
gibt es eine andere möglichkeit an die internen typen zu gelangen von der ich noch nichts weiß.
Naja, typeof ist eigentlich schonmal ein sehr guter Start, Du musst lediglich noch einige Spezialfälle abarbeiten. Wenn type == "object" ist, dann kann das vom Typ her auch null sein, d.h. Du musst extra noch auf "null" prüfen. Und es gibt noch ein paar andere Fälle diesbezüglich, es gab vor einiger Zeit mal im Archiv eine Diskussion zum Thema, Thema damals war, warum typeof für "function"-Objekte eine Ausnahme macht, für "array"-Objekte aber nicht.
Viele Grüße,
Christian