Zahlen sind ein primitiver Typ in JavaScript, aber nur mit typeof lassen sich Zahlen nicht von NaN oder Infinity unterscheiden.
Es ist nützlich zu wissen, wie man überprüft, ob ein Wert vom primitiven Typ Zahl ist, da JavaScript eine dynamisch typisierte Sprache ist.
Der einfachste Weg, auf eine Zahl zu prüfen, ist die Verwendung von typeof
, das für jeden Wert vom primitiven Typ Zahl die Zeichenkette "number"
zurückgibt, einschließlich NaN
Infinity
, und -Infinity
.
Ein Beispiel, bei dem eine Zahl als ein anderer Typ angezeigt werden könnte, was auf einen Fehler in meinem Code hinweist, wäre beim Parsen von Währungen:
In diesem Fall wüsste ich, dass ich vergessen habe, den String in eine Zahl zu parsen, wenn ich von typeof
den Wert „string
“ zurückerhalte.
Wenn ich parseFloat()
verwende, um den Währungswert zu überprüfen, aber ich habe vergessen, das Währungssymbol zu entfernen, erhalte ich einen fehlgeschlagenen Parse und ein seltsames Ergebnis:
Oh, nein. In diesem Fall sieht es so aus, als würde typeof
nicht so funktionieren, wie ich es erwartet habe – weil NaN
-Werte in JavaScript als Zahlen betrachtet werden.
Wenn das Schlüsselwort typeof „number“
Eine offensichtliche Lösung, um nach dem primitiven Typ number zu suchen, ist die Verwendung des Schlüsselworts typeof
, wie ich oben gezeigt habe.
Aber typeof
ist eine unvollständige Lösung, da es in JavaScript zwei spezielle Werte gibt: NaN
(„Not a Number“) und Infinity
.
Für mein Währungsbeispiel weiß ich, dass ich einen Fehler habe, wenn mein Geldwert NaN
oder Infinity
ist, aber typeof
liefert "number"
für diese beiden Werte.
Vielleicht wurde meine Eingabe mit einem Währungssymbol geschrieben, und ich habe einfach versucht, parseFloat()
zu verwenden, um den Wert zu erfassen. Das würde zu NaN
führen:
Eine eigene isNumber() Funktion
Arobust, benutzerdefinierte isNumber()
Funktion würde typeof
verwenden, um auf den primitiven Typ zu prüfen, auf NaN
Werte zu prüfen und auf Infinity
zu prüfen:
Oder, für den Fall, dass man sich sicher ist, dass NaN
und Infinity
nicht auftauchen werden, würde die Überprüfung von typeof==="number"
genügen.
Der Einliner
Ich liebe Einzeiler. Ich denke, dass sie mit Kommentaren dokumentiert werden müssen, aber ich denke, dass sie eigentlich sehr nützlich sind, nicht nur schick.
Hier ist der Einzeiler dafür, wie man in JavaScript nach einer Zahl sucht:
Es gibt aber eine bessere Möglichkeit, in JavaScript auf eine endliche Zahl zu prüfen – die Hilfsfunktion Number.isFinite()
hat das gleiche Verhalten wie die von mir geschriebene eigene isNumber()
-Funktion. Ein Beispiel füge ich im nächsten Abschnitt ein.
Der einfachste Weg, eine Zahl zu überprüfen: Number.isFinite()
Es ist eigentlich unnötig, eigene Funktionen zu schreiben, um auf eine Zahl zu prüfen, allerdings ist es lehrreich, sich zu merken, dass die JavaScript-Werte Infinity
-Infinity
und NaN
alle vom primitiven Typ Zahl sind.
„Die Methode
Number.isFinite()
ermittelt, ob der übergebene Wert eine endliche Zahl ist.“ – MDN Docs
Die Number.isFinite()
-Methode liefert true
für endliche Zahlen, und false
für Infinity
-Infinity
, und NaN
– genau das, was wir wollen:
Es gibt auch die globale isFinite()
-Funktion, die eine Typenzwangskonstruktion durchführt (z. B. das Zwingen von Zeichenketten zu Zahlen), wie oben gezeigt.
Ich bespreche diese Methoden ausführlich in meinem Artikel über Infinity
in Das Startup:
Prüfen, ob eine Variable eine Ganzzahl ist
Um zu prüfen, ob die Variable A eine Ganzzahl ist, könnte ich den losen Gleichheitsoperator ==
verwenden, um zu sehen, ob der geparste Wert gleich sich selbst ist.
Der folgende Codeschnipsel zeigt ein Beispiel, wie man auf eine ganze Zahl prüft:
Die Verwendung von typeof
würde einen String, der in eine Zahl umgewandelt wird, von einer tatsächlichen Zahl unterscheiden, ebenso wie der strenge Gleichheitsoperator ===
.
Währungssymbole ausblenden
Für eine bessere, robustere Funktion möchte ich Währungssymbole (z. B. das Dollarzeichen und eventuelle Kommata) zunächst herauslösen.
Das gründliche Parsen von Geld mit regulären Ausdrücken in JavaScript würde den Rahmen dieses Artikels sprengen, aber dieser Code entfernt $
und ,
vor dem Parsen:
Beachten Sie, dass die globalen Funktionen parseInt()
und parseFloat()
Werte in Strings umwandeln, wenn nötig, und geben NaN
zurück, wenn die Umwandlung fehlschlägt.
Es gibt auch die Funktionen Numbers.parseInt()
und Number.parseFloat()
, die genau das gleiche Verhalten haben.
Laut den MDN Docs wurden diese doppelten Funktionen in ECMAScript 2015 für die „Zweckmodularisierung von Globals“ hinzugefügt.“
Hat JavaScript eigentlich separate Ganzzahlen?
Nein, JavaScript hat nur einen Zahlentyp, der intern als 64-Bit-Gleitkommadarstellung dargestellt wird.
Diese Gleitkommazahl ist der primitive Datentyp number, und es gibt auch einen Typ namens BigInt, der für beliebig große Zahlen verwendet werden kann.
Die globalen Funktionen parseInt()
und parseFloat()
unterscheiden sich in dem, was sie erwarten und ausgeben, aber nicht, weil es tatsächlich separate Integer- und Fließkommatypen in JavaScript gibt.
Fazit
Die Überprüfung einer Zahl in JavaScript ist nicht besonders kompliziert – typeof
funktioniert im Grunde so, wie es sollte, solange man sich bewusst ist, dass sowohl NaN
als auch Infinity
die Zahl typeof
haben.
Der einfachste Weg, auf eine endliche Zahl zu prüfen (d.h. nicht NaN
oder Infinity
) in JavaScript zu überprüfen, ist die Verwendung von Number.isFinite()
, das Werte nicht in Zahlen umwandelt, oder des globalen isFinite()
, das eine Typumwandlung durchführt.
Die Überprüfung auf eine ganze Zahl beinhaltet die Verwendung der Funktion parseInt()
, gefolgt von einem Vergleich des geparsten Wertes mit sich selbst mittels ==
(das Nicht-Zahlenwerte wie Strings in Zahlen umwandelt) oder ===
(das nur true zurückgibt, wenn beide Werte Zahlen sind).
Unter der Haube sind Integers und Floats alle gleich: JavaScript hat nur einen Zahlentyp, den primitiven Typ number.
Weitere Lektüre
- Die Funktion
Number.isInteger()
zwingt Zeichenketten nicht zu Zahlen:
- Sumit Kumar Pradhan schrieb über die Prüfung auf Zahlen auf Dev.to:
- Chris Ferdinandi diskutierte das Parsen von Zahlen auf seinem Vanilla-JS-Blog:
- Der reguläre Ausdruck
^+(\.{1,2})?$
passt auf Geld:
- Sarah Dayan schrieb über das Parsen von Geld in JavaScript auf Frontstuff: