Weiß jemand, wie ich überprüfen kann, ob eine Variable eine Zahl oder eine Zeichenfolge in JavaScript ist?
javascript
types
Jin Yong
quelle
quelle
Antworten:
Wenn Sie mit Literalnotation und nicht mit Konstruktoren arbeiten, können Sie typeof : verwenden.
Wenn Sie Zahlen und Strings über einen Konstruktor erstellen, wie zum Beispiel
var foo = new String("foo")
, sollten Sie bedenken , dasstypeof
zurückkehrenobject
zufoo
.Eine narrensichere Methode zur Überprüfung des Typs wäre möglicherweise die Verwendung der Methode in underscore.js (kommentierte Quelle finden Sie hier ).
Dies gibt einen Booleschen Wert
true
für Folgendes zurück:quelle
var myString = new String("stuff I like"); isString(myString)
dies false zurückgibt. Außerdem bin ich mir nicht ganz sicher, wie lange die Hintergrundkonvertierung dauert. Ich weiß, wenn ich "hi" .length aufrufe, wird "hi" in ein Objekt konvertiert, nicht sicher, wie schnell es wieder konvertiert wird oder ob dies jemals gebunden ist zur Variablen.Der beste Weg, dies zu tun, ist das
isNaN
Casting vom Typ +:All-in-Methode aktualisiert:
Das gleiche mit Regex:
quelle
null
wird auf 0 gezwungen und gibt true fürisNumber(null);
function is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
Der beste Weg, den ich gefunden habe, besteht darin, entweder nach einer Methode für die Zeichenfolge zu suchen, dh:
oder wenn Sie etwas mit der Nummernprüfung für eine Zahleneigenschaft tun möchten,
Dies ist eine Art "Ententippen". Es liegt an Ihnen, welcher Weg am sinnvollsten ist. Ich habe nicht genug Karma, um Kommentare abzugeben, aber typeof schlägt für Zeichenfolgen und Zahlen in Kästchen fehl, dh:
wird "Objekt" alarmieren.
quelle
typeof
es immer auf einen String testen kann, ob primitiv oder String-Objekt. Sie müssen nur nach einer Methode suchen, die für den gewünschten Typ eindeutig ist.{substring:"hello"}
. Ich weiß für meine Zwecke, dass ich gerade getestet habe, was die spezifische Operation, die ich ausführen musste (Modul), für den Typ bewirkt, nach dem ich suchen musste (bei Zeichenfolgen gibt der Modul undefiniert zurück), und dann darauf überprüft habe, anstatt den Typ zu erhalten.Sie suchen
isNaN()
:Siehe JavaScript isNaN () -Funktion bei MDN.
quelle
isNaN
Renditenfalse
fürnull
(abertrue
fürundefined
).Überprüfen Sie, ob der Wert ein String-Literal oder ein String-Objekt ist:
Gerätetest:
Das Suchen nach einer Nummer ist ähnlich:
quelle
function is (type, value) { return value["constructor"] === type; }
?Seit ES2015 ist der richtige Weg zu prüfen, ob eine Variable eine gültige Nummer enthält
Number.isFinite(value)
Beispiele:
quelle
Versuche dies,
quelle
Der beste Weg, dies zu tun:
Dies erfüllt die folgenden Testfälle:
quelle
Oder passen Sie es an, um einen unbekannten Typ zurückzugeben:
12. Mai 2012 Update: Vollständiges Beispiel bei Javascript: Ein besserer Typ .
quelle
realTypeOf
:realTypeOf(NaN) -> "Number"
das gleiche Verhalten wietypeof
vereinbart, aber immer noch alles andere als ideal.Hier ist ein Ansatz, der auf der Idee basiert, die Eingabe in eine Zahl oder Zeichenfolge zu zwingen, indem Null oder die Nullzeichenfolge hinzugefügt werden, und dann einen typisierten Gleichheitsvergleich durchzuführen.
Aus irgendeinem unergründlichen Grund
x===x+0
scheint es besser zu funktionieren alsx===+x
.Gibt es Fälle, in denen dies fehlschlägt?
In der gleichen Richtung:
Dies scheint etwas schneller als entweder
x===true || x===false
odertypeof x==="boolean"
(und viel schneller alsx===Boolean(x)
) zu sein.Dann gibt es auch noch
All dies hängt von der Existenz einer "Identitäts" -Operation ab, die für jeden Typ spezifisch ist und auf jeden Wert angewendet werden kann und zuverlässig einen Wert des fraglichen Typs erzeugt. Ich kann mir keine solche Operation für Daten vorstellen.
Für NaN gibt es
Dies ist im Grunde genommen die Version des Unterstrichs, und sie ist derzeit etwa viermal schneller als
isNaN()
, aber die Kommentare in der Unterstrichquelle erwähnen, dass "NaN die einzige Zahl ist , die sich selbst nicht entspricht" und fügen eine Prüfung für _.isNumber hinzu. Warum? Welche anderen Objekte würden sich nicht selbst entsprechen? Auch Unterstrich verwendet -x !== +x
aber welchen Unterschied könnte das+
hier machen?Dann für die Paranoiden:
oder dieses
quelle
Kannst du es einfach durch 1 teilen?
Ich gehe davon aus, dass das Problem eine Zeichenfolgeneingabe wie "123ABG" ist.
Nur so, wie ich es kürzlich gemacht habe.
quelle
Wie wäre es nur mit:
Nach einer weiteren Überprüfung viele Monate später wird nur garantiert, dass
obj
es sich um ein Objekt handelt, für das der Methoden- oder EigenschaftsnametoLowerCase
definiert ist. Ich schäme mich für meine Antwort. Bitte sehen Sie die am besten gewähltetypeof
.quelle
Oder verwenden Sie einfach die Umkehrung von
isNaN()
:Und ja, die Verwendung von jQuery's
$.isNumeric()
macht mehr Spaß.quelle
isNaN('123')
gibt false, obwohl das Argument eine numerische Zeichenfolge und kein numerischer Typ istIch denke, das Konvertieren der Variable in eine Zeichenfolge verringert die Leistung, zumindest zeigt dieser in den neuesten Browsern durchgeführte Test dies.
Wenn Sie sich also für Leistung interessieren, würde ich Folgendes verwenden:
zum Überprüfen, ob die Variable eine Zeichenfolge ist (selbst wenn Sie verwenden
var str = new String("foo")
,str instanceof String
würde true zurückgegeben).Um zu überprüfen, ob es eine Nummer ist, würde ich mich für den Eingeborenen entscheiden :
isNaN
; Funktion.quelle
jQuery verwendet Folgendes:
quelle
Diese Lösung löst viele der hier aufgeworfenen Probleme!
Dies ist bei weitem die zuverlässigste Methode, die ich bei weitem verwendet habe. Ich habe das nicht erfunden und kann mich nicht erinnern, wo ich es ursprünglich gefunden habe. Aber es funktioniert dort, wo andere Techniken versagen:
Beispiel für Richtigkeit
quelle
typeof
Wenn ich eine Geschwindigkeit von mehr als 1 Million Iterationen teste , finde ich, dass sie nicht schlechter als die Hälfte der Geschwindigkeit der nativen Methode (0,788 s gegenüber 1,481 s) in Chrome ist. Dies ist angesichts der verbesserten Ergebnisse sicherlich eine akzeptable Leistung. Warum denkst du, ist es "sehr langsam"? Vielleicht ist es - in IE6 / 7/8? Aber in diesen Browsern ist alles "sehr langsam".typeof
ist 100x schneller. Was fehlt mir?Jsut ein FYI, wenn Sie jQuery verwenden, haben Sie
um damit umzugehen. Weitere Details unter http://api.jquery.com/jQuery.isNumeric/
quelle
Typ funktioniert in den meisten Fällen sehr gut für mich. Sie können versuchen, eine if-Anweisung zu verwenden
Dabei ist x ein beliebiger Variablenname Ihrer Wahl
quelle
Der beste Weg, den ich gefunden habe, der auch an positive und negative Zahlen denkt, ist von: O'Reilly Javascript und DHTML Cookbook :
}}
quelle
Errr? Verwenden Sie einfach reguläre Ausdrücke! :) :)
quelle
Da eine Zeichenfolge als '1234' mit typeof 'string' anzeigt und die Umkehrung niemals passieren kann (typeof 123 ist immer eine Zahl), ist es am besten, einen einfachen regulären Ausdruck zu verwenden
/^\-?\d+$/.test(var)
. Oder eine fortgeschrittenere Methode, um Floats, Ganzzahlen und negative Zahlen abzugleichen./^[\-\+]?[\d]+\.?(\d+)?$/
Die wichtige Seite.test
ist, dass keine Ausnahme ausgelöst wird, wenn die Variable keine Zeichenfolge ist. Der Wert kann beliebig sein.Wenn Sie nach dem echten Typ suchen, reicht nur typeof aus.
quelle
Die Antwort von @ BitOfUniverse ist gut und ich habe einen neuen Weg gefunden:
Ich weiß,
0
kann keine Dividende sein, aber hier funktioniert die Funktion perfekt.quelle
Typprüfung
Sie können den Variablentyp mit dem
typeof
Operator überprüfen :Wertprüfung
Der folgende Code gibt true für Zahlen und false für alles andere zurück:
quelle
typeof
Operator verwenden! @ JustAMartinnumber
aber wenn ich '123' oder 'abc' oder ein anderes zitiertes Literal übergebe, ist es eine Zeichenfolge, und es spielt keine Rolle, ob es in eine Zahl analysiert werden kann oder nicht.Die XOR-Operation kann zum Erkennen von Zahlen oder Zeichenfolgen verwendet werden. Zahl ^ 0 gibt immer die Zahl als Ausgabe an und Zeichenfolge ^ 0 gibt 0 als Ausgabe an.
quelle
Einfach und gründlich:
Testfälle:
quelle
Einfach benutzen
oder
Wenn Sie Zeichenfolgen verarbeiten möchten, die als Objekte oder Literale definiert und gespeichert sind, möchten Sie keine Hilfsfunktion verwenden.
quelle
quelle
Sehr spät zur Party; Das Folgende hat für mich jedoch immer gut funktioniert, wenn ich überprüfen möchte, ob eine Eingabe entweder eine Zeichenfolge oder eine Zahl auf einmal ist.
quelle
Erstellt ein jsperf bei der Überprüfung, ob eine Variable eine Zahl ist. Ziemlich interessant! Typ hat tatsächlich eine Leistungsverwendung. Wenn Sie
typeof
etwas anderes als Zahlen verwenden, beträgt die Geschwindigkeit im Allgemeinen einvariable.constructor
Drittel, da die meisten Datentypen in Javascript Objekte sind. Zahlen sind nicht!http://jsperf.com/jemiloii-fastest-method-to-check-if-type-is-a-number
typeof variable === 'number'
| am schnellsten | Wenn Sie eine Zahl wie 5 und nicht '5'typeof parseFloat(variable) === 'number'
| möchten am schnellsten | Wenn Sie eine Zahl wie 5 und '5' möchtenisNaN()
ist langsamer, aber nicht viel langsamer. Ich hatte große Hoffnungen aufparseInt
undparseFloat
sie waren jedoch schrecklich langsamer.quelle
Für die Erkennung von Zahlen ist die folgende Passage aus JavaScript relevant: The Good Parts von Douglas Crockford:
quelle