2010-06-10 4 views
5

Pourquoi la fonction Javascript isNaN (123.) Renvoie false? (remarquez le point (.) après 123). Est-ce un nombre universellement acceptable ou va-t-il causer des erreurs en aval?Pourquoi isNaN (123.) Renvoie false?

Je valide si une valeur est une valeur décimale valide en utilisant isNaN avec split. Y a-t-il des problèmes de navigateur avec isNaN? Dois-je utiliser une implémentation sur mesure?

Merci.

+1

Je ne comprends pas votre question. Puisque 123 ** est ** un nombre, le prédicat "est ** pas ** un nombre" est faux. Qu'attendez-vous? – Gabe

+0

notez le point (.) Après 123 – vivekraman

+3

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

Répondre

17

En JavaScript la grammaire d'un Numeric Literal est exprimé comme ceci:

DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt 

Comme vous pouvez le voir la partie DecimalDigits après le point est en option (suffixe opt).

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

Je ne recommanderais pas la fonction isNaN pour détecter le nombre, puisque coercition de type peut faire certaines choses semblent étrange:

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 doit être utilisé que pour comparer contre NaN, depuis:

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

Si vous voulez détecter Number objets, Number valeurs ou des chaînes numériques "parseable", jetez un oeil à this function J'ai posté il ya un certain temps.

+0

+1 Pour avoir cité la spécification. –

+0

merci. ça répond – vivekraman

0

La fonction est appelée "n'est pas un nombre". Donc, cela devrait retourner false si vous entrez un nombre et vrai si ce n'est pas le cas. Même avec le point derrière, ce nombre est toujours valide. 123. Valide juste comme 123 ou 123.0.

+1

En fait, ça s'appelle "est NaN". La différence est subtile, mais importante. –

1

NaN ou (pas un nombre) est une valeur en virgule flottante particulier, ce qui signifie une valeur qui ne peut pas être représentée par des ordinateurs (en utilisant le IEEE 754 floating point standard). Pour vous, la fonction isNaN() fait de son mieux pour traduire les nombres en virgule flottante, ce qui explique pourquoi votre exemple retourne vrai. Voir, par exemple:

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

Si vous souhaitez accéder à un numéro tel que "123." comme un flotteur, essayez d'utiliser parseFloat():

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

En outre, 123. est un numéro valide en javascript, ce qui n » t exiger une partie fractionnaire après le point décimal. Donc, isNan() se comporte correctement, et devrait retourner false dans ce cas.

Questions connexes