Desde las primeras versiones de la especificación de la función isNaN
, su comportamiento para argumentos no numéricos ha sido confuso. Cuando el argumento de la función isNaN
no es de tipo Número, el valor se convierte primero en un Número. Luego, el valor resultante se prueba para determinar si es NaN
. Por lo tanto, para los no números que cuando se coaccionan a tipo numérico dan como resultado un valor numérico no NaN válido (en particular, la cadena vacía y las primitivas booleanas, que cuando se coaccionan dan valores numéricos cero o uno), el valor devuelto «falso» puede ser inesperado; la cadena vacía, por ejemplo, seguramente «no es un número». La confusión surge del hecho de que el término «no es un número» tiene un significado específico para los números representados como valores de coma flotante IEEE-754. La función debe interpretarse como una respuesta a la pregunta, «¿este valor, cuando se coacciona a un valor numérico, es un valor IEEE-754» No es un número «?»
ECMAScript 2015 contiene el Number.isNaN()
función. Number.isNaN(x)
es una forma confiable de probar si x
es NaN
o no. Sin embargo, incluso con Number.isNaN
, el significado de NaN
sigue siendo el significado numérico preciso y no, «no es un número». De manera alternativa, en ausencia de Number.isNaN
, la expresión (x != x)
es una forma más confiable de probar si la variable x
es NaN
o no, ya que el resultado no está sujeto a los falsos positivos que hacen que isNaN
no sea confiable.
Un polyfill para isNaN
sería (el polyfill aprovecha la característica única de nunca igual a sí mismo de NaN
):