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:
function isNaNDemo(arg){
var x = new Number(arg).valueOf();
return x != x;
}
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:
function isNaNstatic(x){
return x != x;
}
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 ejemplo isNaNStatic(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.