2010-06-10 21 views
5

¿Por qué la llamada a la función Javascript esNaN (123.) Devuelve falso? (observe el punto (.) después de 123). ¿Es este un número universalmente aceptable o causará errores aguas abajo?¿Por qué isNaN (123.) Devuelve falso?

Estoy validando si un valor es un decimal válido usando isNaN junto con split. ¿Hay problemas entre navegadores con isNaN? ¿Debo usar una implementación a medida?

Gracias.

+1

No entiendo su pregunta. Como 123 ** es ** un número, el predicado "es ** no ** un número" es falso. ¿Qué estás esperando? – Gabe

+0

observe el punto (.) Después de 123 – vivekraman

+3

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

Respuesta

17

En JavaScript la gramática de una Numeric Literal se expresa así:

DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt 

Como se puede ver la parte DecimalDigits después del punto es opcional (sufijo opt).

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

no recomendaría la función isNaN para detectar los números, ya que tipo de coacción puede hacer que algunas cosas se ven extraña:

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 sólo debe utilizarse para comparar contra NaN, desde:

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

Si desea detectar objetos Number, valores Number o cadenas numéricas "analizables", eche un vistazo a this function que publiqué hace algún tiempo.

+0

+1 Para cotizar la especificación. –

+0

gracias. eso lo contesta – vivekraman

0

La función se llama "no es un número". Por lo tanto, esto debería devolver falso en caso de que ingrese un número y verdadero si no es así. Incluso con el punto detrás, este número sigue siendo válido. 123. solo valida como 123 o 123.0.

+1

En realidad, se llama "es NaN". La diferencia es sutil pero importante. –

1

NaN o (no un número) es un valor de punto flotante en particular, lo que significa un valor que no puede ser representado por las computadoras (utilizando el IEEE 754 floating point standard).

Lo más importante es que la función isNaN() hace un gran esfuerzo para traducir números al punto flotante, por lo que su ejemplo devuelve verdadero. Véase, por ejemplo:

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

Si desea acceder a un número como "123." como un flotador, trate de usar parseFloat():

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

Además, 123. es un número válido en javascript, que doesn' t requiere una parte fraccionaria después del punto decimal. Por lo tanto, isNan() se comporta correctamente y debería devolver falso en este caso.

Cuestiones relacionadas