Respostas:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
Você poderia usar a isFinite
função em vez disso, dependendo de como deseja tratar NaN
. isFinite
retorna false
se o seu número for POSITIVE_INFINITY
, NEGATIVE_INFINITY
ou NaN
.
if (isFinite(result))
{
// ...
}
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 redefinir Infinity
, 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 no isFinite
lugar.
Number.POSITIVE_INFINITY
e Number.NEGATIVE_INFINITY
são somente leitura (testado no Chrome8, FF3.6 e IE8). Usar 1/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 usar isFinite
é 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
ou n === n/0
funciona:
function isInfinite(n) {
return n === n/0;
}
Esteja ciente de que o nativo isFinite()
força a entrada de números. isFinite([])
e isFinite(null)
são ambos, true
por exemplo.
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 tente n === 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
, O Number.isFinite()
método determina se o valor passado é um número finito.
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
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: _.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
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-positivo NaN
, fiz uma solução simples para contornar isso:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
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:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
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:
function isInfinite(num) {
return !isFinite(num);
}
E use como:
isInfinite(null); //false
isInfinite(1); //false
isInfinite(0); //false
isInfinite(0.00); //false
isInfinite(NaN); //true
isInfinite(-1.797693134862316E+308); //true
isInfinite(Infinity); //true
isInfinite(-Infinity); //true
isInfinite(+Infinity); //true
isInfinite(undefined); //true
Você também pode Number.isFinit
verificar se o valor também é Número e se é mais preciso para verificação undefined
e null
etc ...
Ou você pode polyfill assim:
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITY
vez de-?Infinity
ou-?1/0
?