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 Infinityaparición de la palabra y, por ejemplo, se muestra en su 0.0lugar?
                    
                        javascript
                                infinity
                                
                    
                    
                        Homer_J
fuente
                
                
            fuente

Number.(POSITIVE|NEGATIVE)_INFINITYlugar de-?Infinityo-?1/0?Infinitypropiedad 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,NaNetc. debe esperar que sucedan cosas extrañas).Number.(POSITIVE|NEGATIVE)_INFINITYtampoco es de solo lectura ,Infinityes de solo lectura en modo estricto. Además, ¿qué pasa con el-?1/0caso que les presenté? De todos modos, casi siempre deberías usarisFiniteen su lugar.Number.POSITIVE_INFINITYyNumber.NEGATIVE_INFINITYson de solo lectura (probados en Chrome8, FF3.6 e IE8). El uso1/0funciona bien, pero no será tan obvio para quienes mantienen su código lo que realmente está tratando de probar. Estoy de acuerdo en que usarisFinitees 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.definePropertyy__defineGetter__.Infinity, por otro lado, no es configurable en modo estricto.Un simple
n === n+1on === n/0funciona:Tenga en cuenta que el nativo
isFinite()coacciona las entradas a los números.isFinite([])yisFinite(null)son ambos,truepor ejemplo.fuente
n === n+1se 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+1no 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.isFinitees 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
NaNo,Infinitypero 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
NaNs, 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.isFinitE, que también comprobar si el valor es un número demasiado y es más preciso para la comprobaciónundefinedynulletc ...O puede rellenarlo así:
fuente