javascript - sirve - ¿Por qué buscar! IsNaN() después de isFinite()?
parseint typescript (5)
La única diferencia es esta:
!isNan(1/0) // --> true
isFinite(1/0) // --> false
isNaN verifica si el argumento es un número o no. Las Infinidades (+/-) también son numéricas, por lo que pasan la verificación isNaN, pero no pasan la verificación isFinite.
** Tenga en cuenta que cualquier cadena que se pueda analizar como un número ("2", "3.14") hará que isNaN devuelva falso.
Espero que esto ayude.
PD: La respuesta dada por el usuario 1170379 fue casi perfecta.
Encontré la función goog.math.isFiniteNumber
en Google Closure Library . Lo que hace es verificar si un número dado es tanto finito como no NaN
.
El código subyacente es:
goog.math.isFiniteNumber = function(num) {
return isFinite(num) && !isNaN(num);
};
Entonces, primero verifica si el número es finito usando la función nativa isFinite
, y luego hace una verificación adicional para asegurarse de que el número no sea NaN
usando isNaN
.
Sin embargo, isFinite
ya devuelve false en caso de que el argumento sea NaN
. Entonces, ¿qué ventajas ofrece el chequeo para isNaN
?
Probablemente por la misma razón que he implementado (isfinite(num) && isfinite(-num))
- Estaba recibiendo errores de mysql quejándose de poner "-nan" en la base de datos, aunque tenía una comprobación de isfinite(field)
. ..
Un artículo útil sobre este tema es http://jacksondunstan.com/articles/983 que proporciona una optimización ((d*0.0)==0.0)
Si isFinite
funcionó de la misma manera que lo isFiniteNumber
, entonces no habría razón para escribir isFiniteNumber. Probablemente hay algún navegador en algún lugar que trata a NaN como finito.
isNaN () devuelve verdadero si el argumento no es un número o si es un valor no numérico, como una cadena o un objeto. De lo contrario, devuelve falso. Ejemplo: isNaN(0/0) =>true;
isNaN(2-1) =>false;
isFinite () devuelve true si el argumento es un número distinto de NaN, Infinity o -Infinity. De lo contrario, devuelve false. Ejemplo: isFinite("2000") =>false;
isFinite (200/2) => true; `
podría razonar [¿Por qué?] después de leer esto:
NaN no verifica si el valor pasado es infinito o no, verifica si la entrada val se evalúa en un resultado final de "Tipo: Número". Debido a que se acepta isNaN (cadena), por lo que: isNaN ("3.14") // false (lo que significa verdadero), el token dado se convierte en pato en un Número de tipo con éxito)
Puede comprender que el valor de entrada puede ser un número bruto sin resolver, incluso una operación matemática tan simple como: (x / y); que a su vez podría producir un número (+/- infinito).
Aquí x = 1, y = 0; significado (1/0). Luego isNaN (x / y) primero evaluará a isNaN (1/0); luego a isNaN (infinito) // false. Dado que (1/0) = el infinito es de tipo: "número", es decir, typeof (1/0) // "número" isNaN debe y devolverá false.
No desea poner "infinito" donde se espera un número de resultado final.