2010-06-10 8 views
5

Warum ruft die Javascript-Funktion isNaN (123) auf false zurück? (Beachten Sie den Punkt (.) nach 123). Ist das eine allgemein akzeptable Zahl oder wird es stromabwärts Fehler verursachen?Warum gibt isNaN (123.) False zurück?

Ich überprüfe, ob ein Wert eine gültige Dezimalzahl ist mit IsNaN zusammen mit Split. Gibt es browserübergreifende Probleme mit isNaN? Soll ich eine maßgeschneiderte Implementierung verwenden?

Danke.

+1

Ich verstehe Ihre Frage nicht. Da 123 ** eine Zahl ist, ist das Prädikat "ist ** nicht ** eine Zahl" falsch. Was erwarten Sie? – Gabe

+0

Beachten Sie den Punkt (.) Nach 123 – vivekraman

+3

In Javascript, 123 == 123. == 123.0 – squelart

Antwort

17

In JavaScript, um die Grammatik einer Numeric Literal wird wie folgt ausgedrückt:

DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt 

Wie Sie den DecimalDigits Teil sehen kann, nachdem der Punkt optional (opt Suffix) ist.

var n = 123.; 
typeof n; // "number" 

Ich würde die isNaN Funktion nicht empfehlen Zahlen zu erkennen, da Art Zwang einige Dinge seltsam aussehen machen:

isNaN(""); // false, a empty string coerces to zero 
isNaN("\n\t"); // false, a white-space string coerces to zero 
isNaN(true); // false, boolean true coerces to 1 
isNaN(false); // false, boolean false coerces to zero 
isNaN(new Date); // false, Date objects coerce to its numeric timestamp 
// etc... 

isNaN sollte nur gegen NaN vergleichen verwendet werden, seit:

NaN == NaN; // false! 
IsNaN(NaN); // true 

Wenn Sie Number Objekte, Number Werte oder "parseable" numerische Zeichenfolgen erkennen wollen, werfen Sie einen Blick auf this function Ich habe vor einiger Zeit gepostet.

+0

+1 Zum Zitieren der Spezifikation. –

+0

danke. Das beantwortet es – vivekraman

0

Die Funktion heißt "ist keine Nummer". Also sollte dies false zurückgeben, wenn Sie eine Zahl eingeben, und true, wenn dies nicht der Fall ist. Selbst mit dem Punkt dahinter ist diese Nummer noch gültig. 123. validiert nur als 123 oder 123.0.

+1

Eigentlich heißt es "is NaN". Der Unterschied ist subtil, aber wichtig. –

1

NaN oder (keine Zahl) ist ein besonderer Gleitkommazahlen Wert, was bedeutet, ein Wert, der nicht von Computern dargestellt werden kann (die IEEE 754 floating point standard verwenden).

Entscheidend für Sie ist die Funktion isNaN(), die versucht, Zahlen in Fließkommazahlen zu übersetzen, weshalb Ihr Beispiel "true" zurückgibt. Siehe zum Beispiel:

isNaN(100);     //Returns false 
isNaN("100");     //Returns false 
isNaN("ABC");     //Returns true 
isNaN("10C");     //Returns true 
isNaN(Math.sqrt(-1));   //Returns true 

Wenn Sie eine Zahl wie "123." als Schwimmer zugreifen möchten, versuchen Sie parseFloat() mit:

parseFloat("123.");   //Returns 123 

Außerdem 123. ist eine gültige Zahl in Javascript, die doesn‘ t benötigen einen Nachkommastellen. So verhält sich isNan() korrekt und sollte in diesem Fall false zurückgeben.