Eu tenho uma série de cálculos Javascript que (somente no IE) mostram o Infinity dependendo das escolhas do usuário.
Como impedir que a palavra Infinity
apareça e, por exemplo, mostrar 0.0
?
javascript
infinity
Homer_J
fonte
fonte
Number.(POSITIVE|NEGATIVE)_INFINITY
vez de-?Infinity
ou-?1/0
?Infinity
propriedade global não é somente leitura, o que significa que pode ser redefinida: por exemplo,var x = 42; Infinity = 42; alert(x === Infinity);
exibe "true" . (É certo que é um caso obscuro, e quem decide redefinirInfinity
,NaN
etc deve esperar coisas estranhas a acontecer.)Number.(POSITIVE|NEGATIVE)_INFINITY
também não é somente leitura,Infinity
é somente leitura no modo estrito. Além disso, e o-?1/0
caso que apresentei a você? De qualquer forma, você quase sempre deve usar noisFinite
lugar.Number.POSITIVE_INFINITY
eNumber.NEGATIVE_INFINITY
são somente leitura (testado no Chrome8, FF3.6 e IE8). Usar1/0
funciona bem, mas não será tão óbvio para os mantenedores do seu código o que você está tentando testar. Concordo que usarisFinite
é quase sempre a melhor maneira de fazer as coisas - é por isso que mencionei isso em minha resposta - mas apenas o OP pode decidir se atende aos seus requisitos.Object.defineProperty
e__defineGetter__
.Infinity
, por outro lado, não é configurável no modo estrito.Um simples
n === n+1
oun === n/0
funciona:Esteja ciente de que o nativo
isFinite()
força a entrada de números.isFinite([])
eisFinite(null)
são ambos,true
por exemplo.fonte
n === n+1
avalia como verdadeiro para todos os números maiores que 2 ^ 53, ou seja, 1e30. O hack da divisão funciona, mesmo para NaN e -Infinity. No entanto, a resposta de LukeH fornece um código muuuuito mais legível.n+1
não podem ser representados e estão sujeitos a arredondamento. Bem, mesmo os inteiros são afetados por erros de arredondamento. A propósito, não acho que seu código seja "à prova de matemática", apenas tenten === n/-0
. Ao completar os reais com +/- inf, seu limite não é bem definido, a menos que a sequência zero subjacente seja considerada positiva.In
ES6
, ONumber.isFinite()
método determina se o valor passado é um número finito.fonte
Na verdade, n === n + 1 funcionará para números maiores que 51 bits, por exemplo
fonte
Gosto de usar Lodash por uma variedade de razões de codificação defensivas , bem como para facilitar a leitura. ES6
Number.isFinite
é ótimo e não tem problemas com valores não numéricos, mas se ES6 não for possível, você já tem lodash ou deseja um código mais breve: _.isFinitefonte
Encontrei um cenário que exigia que eu verificasse se o valor é do tipo
NaN
ou,Infinity
mas passe as strings como resultados válidos. Como muitas strings de texto produzirão falso-positivoNaN
, fiz uma solução simples para contornar isso:O código acima converte valores em strings e verifica se eles são estritamente iguais a NaN ou Infinity (você precisará adicionar outro caso para infinito negativo).
Assim:
fonte
NaN
s, etc.toString()
? Sinta-se à vontade para votar negativamente ou declarar motivos como isso pode gerar resultados inconsistentes ou por que exatamente esse método não é recomendado. Até agora, ainda sinto que adiciona uma opção para quem está procurando uma resposta e não há nenhuma razão concreta para que isso seja perigoso, instável, etc.Você pode usar isFinite na janela
isFinite(123)
:Você pode escrever uma função como:
E use como:
Você também pode
Number.isFinit
verificar se o valor também é Número e se é mais preciso para verificaçãoundefined
enull
etc ...Ou você pode polyfill assim:
fonte