En JavaScript, ¿por qué isNaN(" ")
evaluar a false
, pero isNaN(" x")
evaluar a true
?
Estoy realizando operaciones numérico en un campo de entrada de texto, y yo estoy verificando si el campo es null
, ""
o NaN
. Cuando alguien escribe un puñado de espacios en el campo, mi validación falla en los tres, y estoy confundido sobre por qué pasa el isNaN
control.
javascript
nan
Vengador IVR
fuente
fuente
"" == false // true
yisNaN(" ") // false
Respuestas:
JavaScript interpreta una cadena vacía como un 0, que luego falla la prueba isNAN. Puede usar primero parseInt en la cadena que no convertirá la cadena vacía a 0. El resultado debería fallar isNAN.
fuente
isNaN(arg)
. 1) Convertir arg en número, 2) Verificar si ese número es el valor numéricoNaN
. Eso me ayudó a entenderlo mejor.Puede encontrar esto sorprendente o tal vez no, pero aquí hay un código de prueba para mostrarle la locura del motor de JavaScript.
entonces esto significa que
y
pero
Que te diviertas :)
fuente
null
,""
y" "
yo mismo. ¡Gracias!Para entenderlo mejor, abra el pdf de especificaciones de Ecma-Script en la página 43 "ToNumber Applied to the String Type"
Si una cadena tiene una sintaxis numérica, que puede contener cualquier número de caracteres de espacio en blanco, se puede convertir a tipo de número. La cadena vacía se evalúa a 0. También la cadena 'Infinito' debería dar
fuente
Intenta usar:
O
fuente
Por la
MDN
razón del problema que enfrentaEs posible que desee verificar la siguiente respuesta integral que cubre la comparación NaN para la igualdad también.
fuente
Creo que es por la tipificación de Javascript:
' '
se convierte a cero, mientras'x'
que no lo es:fuente
Si desea implementar una función isNumber precisa, esta es una forma de hacerlo desde Javascript: The Good Parts de Douglas Crockford [página 105]
fuente
La respuesta no completamente correcta
La respuesta altamente votada y aceptada de Antonio Haley aquí supone erróneamente que este proceso pasa por la
parseInt
función de JavaScript :Podemos refutar fácilmente esta declaración con la cadena
"123abc"
:Con esto, podemos ver que la
parseInt
función de JavaScript regresa"123abc"
como el número123
, pero suisNaN
función nos dice que"123abc"
no es un número.La respuesta correcta
ECMAScript-262 define cómo funciona la
isNaN
verificación en la sección 18.2.3 .La
ToNumber
función a la que hace referencia también se define en la sección 7.1.3 de ECMAScript-262 . Aquí, nos dicen cómo JavaScript maneja las cadenas que se pasan a esta función.El primer ejemplo dado en la pregunta es una cadena que no contiene nada más que espacios en blanco. Esta sección establece que:
Por
" "
lo tanto, la cadena de ejemplo se convierte en+0
, que es un número.La misma sección también establece:
Sin citar todas las verificaciones contenidas en esa sección, el
" x"
ejemplo dado en la pregunta cae en la condición anterior ya que no puede interpretarse como aStringNumericLiteral
." x"
por lo tanto se convierte aNaN
.fuente
No estoy seguro de por qué , pero para solucionar el problema, siempre puede recortar espacios en blanco antes de verificar. Probablemente quieras hacer eso de todos modos.
fuente
La función
isNaN("")
realiza una coerción de tipo Cadena a NúmeroECMAScript 3-5 define los siguientes valores de retorno para el operador typeof:
Es mejor envolver nuestra prueba en un cuerpo de función:
Esta función no tiene la intención de probar el tipo de variable , sino que prueba el valor forzado . Por ejemplo, los booleanos y las cadenas se convierten en números, por lo que quizás desee llamar a esta función como
isNumberCoerced()
si no hay necesidad de probar otros tipos que no sean cadena y número , entonces el siguiente fragmento podría usarse como parte de alguna condición:
fuente
Le sugiero que use la siguiente función si realmente desea una verificación adecuada si es un número entero:
fuente
Eso
isNaN(" ")
es falso es parte del comportamiento confuso de laisNaN
función global debido a su coerción de no números a un tipo numérico.De MDN :
Tenga en cuenta también que con ECMAScript 6, ahora también existe el
Number.isNaN
método, que según MDN:Por desgracia :
Incluso el
Number.isNaN
método ECMAScript 6 tiene sus propios problemas, como se describe en la publicación del blog: solución del feo problema de NaN de JavaScript y ES6 .fuente
La
isNaN
función espera un Número como argumento, por lo que los argumentos de cualquier otro tipo (en su caso, una cadena) se convertirán en Número antes de que se realice la lógica de la función real. (¡Tenga en cuenta queNaN
también es un valor de tipo Number!)Por cierto. Esto es común para todas las funciones integradas: si esperan un argumento de cierto tipo, el argumento real se convertirá utilizando las funciones de conversión estándar. Hay conversiones estándar entre todos los tipos básicos (bool, string, number, object, date, null, undefined).
La conversión estándar para
String
toNumber
se puede invocar explícitamente conNumber()
. Entonces podemos ver que:Number(" ")
evalúa a0
Number(" x")
evalúa aNaN
Dado esto, ¡el resultado de la
isNaN
función es completamente lógico!La verdadera pregunta es por qué la conversión estándar de Cadena a Número funciona como lo hace. La conversión de cadena a número realmente está destinada a convertir cadenas numéricas como "123" o "17.5e4" a los números equivalentes. La conversión primero omite el espacio en blanco inicial (por lo que "123" es válido) y luego trata de analizar los restos como un número. Si no se puede analizar como un número ("x" no lo es), entonces el resultado es NaN. Pero existe la regla especial explícita de que una cadena que está vacía o solo un espacio en blanco se convierte a 0. Entonces, esto explica la conversión.
Referencia: http://www.ecma-international.org/ecma-262/5.1/#sec-9.3.1
fuente
Escribí esta pequeña función rápida para ayudar a resolver este problema.
Simplemente verifica si hay caracteres que no sean numéricos (0-9), que no sean '-' o '.', Y que no estén indefinidos, nulos o vacíos y devuelva verdadero si no hay coincidencias. :)
fuente
Como se explicó anteriormente, la
isNaN
función forzará la cadena vacía a un número antes de validarla, cambiando así una cadena vacía a 0 (que es un número válido). Sin embargo, descubrí que laparseInt
función volveráNaN
cuando intente analizar una cadena vacía o una cadena con solo espacios. Como tal, la siguiente combinación parece estar funcionando bien:if ( isNaN(string) || isNaN(parseInt(string)) ) console.log('Not a number!');
Esta verificación funcionará para números positivos, números negativos y números con un punto decimal, por lo que creo que cubre todos los casos numéricos comunes.
fuente
NaN
! == "no es un número"NaN
es un valor de tipo de númeroesta es una definición de isNaN () en ECMAScript
Intenta convertir cualquier valor a Número.
Si desea determinar si el valor es
NaN
, primero debe intentar convertirlo en un valor de Número.fuente
Esta función parecía funcionar en mis pruebas.
fuente
return !(s === "" || s === null || parseInt(s) == 'NaN');
Qué pasa
fuente
La función isNaN incorporada de JavaScript es, como debería esperarse por defecto, un "Operador de tipo dinámico". Por lo tanto, todos los valores que (durante el proceso DTC) pueden producir un verdadero simple | falso como , no puede ser NaN.
"", " ", " 000"
Lo que significa que el argumento suministrado primero se someterá a una conversión como en:
Explicación:
En la línea superior del cuerpo de la función, (primero) estamos tratando de convertir con éxito el argumento en un objeto numérico. Y (segundo), utilizando el operador de punto, estamos, para nuestra conveniencia, quitando inmediatamente el valor primitivo del objeto creado.
En la segunda línea, estamos tomando el valor obtenido en el paso anterior, y la ventaja del hecho de que NaN no es igual a nada en el universo, ni siquiera a sí mismo, por ejemplo:
NaN == NaN >> false
para finalmente compararlo (por desigualdad) consigo mismo .De esta manera, la función return solo será verdadera cuando, y solo si, el argumento-return proporcionado, es un intento fallido de conversión a un objeto numérico, es decir, un número que no es un número; por ejemplo, NaN.
isNaNstatic ()
Sin embargo, para un operador de tipo estático, si es necesario y cuando es necesario, podemos escribir una función mucho más simple como:
Y evite el DTC por completo, de modo que si el argumento no es explícitamente un número NaN, devolverá falso. Por lo tanto, prueba contra lo siguiente:
isNaNStatic(" x"); // will return false
porque sigue siendo una cuerda.Sin embargo:
isNaNStatic(1/"x"); // will of course return true.
como será por ejemploisNaNStatic(NaN); >> true
.Pero al contrario
isNaN
,isNaNStatic("NaN"); >> false
porque (el argumento) es una cadena ordinaria.ps: La versión estática de isNaN puede ser muy útil en escenarios de codificación modernos. Y bien puede ser una de las principales razones por las que me tomé mi tiempo para publicar esto.
Saludos.
fuente
isNAN(<argument>)
es una función para saber si un argumento dado es un número ilegal.isNaN
convierte los argumentos en Tipo de número. Si desea verificar si el argumento es numérico o no? Utilice la$.isNumeric()
función en jQuery.Es decir, isNaN (foo) es equivalente a isNaN (Number (foo)) Acepta cualquier cadena que tenga todos los números como números por razones obvias. Por ej.
fuente
yo uso esto
fuente
Al comprobar si determinado valor de cadena con espacios en blanco o
" "
seisNaN
puede que tratar de realizar la validación de cadena, ejemplo:// value = "123 " if (value.match(/\s/) || isNaN(value)) { // do something }
fuente