Risposte:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
Puoi eventualmente usare la isFinite
funzione, a seconda di come vuoi trattare NaN
. isFinite
restituisce false
se il tuo numero è POSITIVE_INFINITY
, NEGATIVE_INFINITY
o NaN
.
if (isFinite(result))
{
// ...
}
Infinity
proprietà globale non è di sola lettura, il che significa che può essere ridefinita: ad esempio, var x = 42; Infinity = 42; alert(x === Infinity);
visualizza "true" . (Certo, questo è un caso oscuro, e chiunque decida di ridefinire Infinity
, NaN
ecc. Dovrebbe aspettarsi che accadano cose strane.)
Number.(POSITIVE|NEGATIVE)_INFINITY
non è nemmeno di sola lettura , Infinity
è di sola lettura in modalità rigorosa. Inoltre, che mi dici del -?1/0
caso che ti ho presentato? Ad ogni modo, dovresti quasi sempre usare isFinite
invece.
Number.POSITIVE_INFINITY
e Number.NEGATIVE_INFINITY
sono di sola lettura (testati su Chrome8, FF3.6 e IE8). L'uso 1/0
funziona bene ma non sarà così ovvio per i manutentori del tuo codice cosa stai effettivamente cercando di testare. Sono d'accordo che l'uso isFinite
è quasi sempre il modo migliore per fare le cose - ecco perché l'ho menzionato nella mia risposta - ma solo l'OP può decidere se soddisfa i loro requisiti.
Object.defineProperty
e __defineGetter__
. Infinity
, d'altra parte, non è configurabile in modalità rigorosa.
Un semplice n === n+1
o n === n/0
funziona:
function isInfinite(n) {
return n === n/0;
}
Sii consapevole del fatto che il nativo isFinite()
costringe gli input ai numeri. isFinite([])
e isFinite(null)
sono entrambi true
per esempio.
n === n+1
restituisce true per tutti i numeri maggiori di 2 ^ 53, ovvero 1e30. L'hack della divisione funziona, anche per NaN e -Infinity. Tuttavia, la risposta di LukeH ti dà un codice mooolto più leggibile.
n+1
non possono essere rappresentati ed è soggetto ad arrotondamento. Ebbene, anche i numeri interi sono influenzati da errori di arrotondamento. A proposito, non penso che il tuo codice sia "a prova di matematica", prova e basta n === n/-0
. Quando si completano i reali con +/- inf, il limite non è ben definito a meno che non si presuma che la sequenza zero sottostante sia positiva.
In ES6
, Il Number.isFinite()
metodo determina se il valore passato è un numero finito.
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
Mi piace usare Lodash per una serie di motivi difensivi di codifica e leggibilità. ES6 Number.isFinite
è ottimo e non ha problemi con valori non numerici, ma se ES6 non è possibile, hai già lodash o desideri un codice più breve: _.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
Mi sono imbattuto in uno scenario che mi richiedeva di verificare se il valore è del tipo NaN
o Infinity
ma passa le stringhe come risultati validi. Poiché molte stringhe di testo producono falsi positivi NaN
, ho creato una soluzione semplice per aggirarlo:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
Il codice sopra converte i valori in stringhe e controlla se sono strettamente uguali a NaN o Infinity (dovrai aggiungere un altro caso per infinito negativo).
Così:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
NaN
es, ecc.
toString()
invece? Sentiti libero di esprimere un voto negativo o spiegare perché questo potrebbe produrre risultati incoerenti o perché esattamente questo metodo non è raccomandato. Finora, sento ancora che aggiunge un'opzione per chiunque stia cercando una risposta e non ci sono ragioni concrete per cui questo sia pericoloso, instabile, ecc.
Puoi usare isFinite nella finestra isFinite(123)
:
Puoi scrivere una funzione come:
function isInfinite(num) {
return !isFinite(num);
}
E usa come:
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
Puoi Number.isFinit
anche controllare se il valore è anche Numero ed è più accurato per il controllo undefined
enull
ecc ...
O puoi polyfill in questo modo:
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITY
posto di-?Infinity
o-?1/0
?