Tengo una serie de cálculos de Javascript que (solo en IE) muestran Infinity dependiendo de las opciones del usuario.
¿Cómo se detiene la Infinity
aparición de la palabra y, por ejemplo, se muestra en su 0.0
lugar?
javascript
infinity
Homer_J
fuente
fuente
Number.(POSITIVE|NEGATIVE)_INFINITY
lugar de-?Infinity
o-?1/0
?Infinity
propiedad global no es de solo lectura, lo que significa que se puede redefinir: por ejemplo,var x = 42; Infinity = 42; alert(x === Infinity);
muestra "verdadero" . (Es cierto que ese es un caso oscuro, y cualquiera que decida redefinirInfinity
,NaN
etc. debe esperar que sucedan cosas extrañas).Number.(POSITIVE|NEGATIVE)_INFINITY
tampoco es de solo lectura ,Infinity
es de solo lectura en modo estricto. Además, ¿qué pasa con el-?1/0
caso que les presenté? De todos modos, casi siempre deberías usarisFinite
en su lugar.Number.POSITIVE_INFINITY
yNumber.NEGATIVE_INFINITY
son de solo lectura (probados en Chrome8, FF3.6 e IE8). El uso1/0
funciona bien, pero no será tan obvio para quienes mantienen su código lo que realmente está tratando de probar. Estoy de acuerdo en que usarisFinite
es casi siempre la mejor manera de hacer las cosas, por eso lo mencioné en mi respuesta, pero solo el OP puede decidir si cumple con sus requisitos.Object.defineProperty
y__defineGetter__
.Infinity
, por otro lado, no es configurable en modo estricto.Un simple
n === n+1
on === n/0
funciona:Tenga en cuenta que el nativo
isFinite()
coacciona las entradas a los números.isFinite([])
yisFinite(null)
son ambos,true
por ejemplo.fuente
n === n+1
se evalúa como verdadero para todos los números mayores que 2 ^ 53, es decir, 1e30. El truco de división funciona, incluso para NaN e -Infinity. Sin embargo, la respuesta de LukeH le brinda un código mucho más legible.n+1
no se pueden representar y están sujetos a redondeo. Bueno, incluso los números enteros se ven afectados por los errores de redondeo. Por cierto, no creo que tu código sea "a prueba de matemáticas", solo inténtalon === n/-0
. Al completar los reales con +/- inf, su límite no está bien definido a menos que se asuma que la secuencia cero subyacente es positiva.En
ES6
, ElNumber.isFinite()
método determina si el valor pasado es un número finito.fuente
En realidad, n === n + 1 funcionará para números mayores de 51 bits, por ejemplo
fuente
Me gusta usar Lodash por una variedad de razones de codificación defensiva , así como por la legibilidad. ES6
Number.isFinite
es excelente y no tiene problemas con valores no numéricos, pero si ES6 no es posible, ya tiene lodash o desea un código más breve: _.isFinitefuente
Me encontré con un escenario que me obligaba a verificar si el valor es del tipo
NaN
o,Infinity
pero pasar cadenas como resultados válidos. Debido a que muchas cadenas de texto producirán falsos positivosNaN
, he creado una solución simple para eludir eso:El código anterior convierte los valores en cadenas y comprueba si son estrictamente iguales a NaN o Infinity (deberá agregar otro caso para el infinito negativo).
Entonces:
fuente
NaN
s, etc.toString()
lugar? Siéntase libre de votar en contra o indicar las razones por las que esto podría producir resultados inconsistentes o por qué no se recomienda exactamente este método. Hasta el momento, todavía siento que añade una opción para quien sea que esté buscando una respuesta y no hay ninguna razón concretas por las que esto es peligroso, inestable, etc.Puede usar isFinite en la ventana
isFinite(123)
:Puedes escribir una función como:
Y usa como:
También puede
Number.isFinit
E, que también comprobar si el valor es un número demasiado y es más preciso para la comprobaciónundefined
ynull
etc ...O puede rellenarlo así:
fuente