Antworten:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
Sie können die isFinite
Funktion möglicherweise stattdessen verwenden, je nachdem, wie Sie sie behandeln möchten NaN
. isFinite
zurück , false
wenn Ihre Zahl ist POSITIVE_INFINITY
, NEGATIVE_INFINITY
oder NaN
.
if (isFinite(result))
{
// ...
}
Infinity
Eigenschaft nicht schreibgeschützt , was bedeutet , dass sie neu definiert werden kann: Zum Beispiel var x = 42; Infinity = 42; alert(x === Infinity);
zeigt „true“ . (Zugegeben, das ist ein dunkler Fall, und jeder, der sich für eine Neudefinition usw. entscheidet Infinity
, NaN
sollte damit rechnen , dass seltsame Dinge passieren.)
Number.(POSITIVE|NEGATIVE)_INFINITY
es auch nicht schreibgeschützt Infinity
ist , ist im strengen Modus schreibgeschützt. Und was ist mit dem -?1/0
Fall, den ich Ihnen vorgestellt habe? Wie auch immer, Sie sollten fast immer isFinite
stattdessen verwenden.
Number.POSITIVE_INFINITY
und Number.NEGATIVE_INFINITY
sind schreibgeschützt (getestet auf Chrome8, FF3.6 und IE8). Die Verwendung 1/0
funktioniert einwandfrei, aber für die Betreuer Ihres Codes ist es nicht so offensichtlich, worauf Sie tatsächlich testen möchten. Ich stimme zu, dass die Verwendung isFinite
fast immer der bessere Weg ist, Dinge zu tun - deshalb habe ich sie in meiner Antwort erwähnt -, aber nur das OP kann entscheiden, ob es ihren Anforderungen entspricht.
Object.defineProperty
und neu definieren __defineGetter__
. Infinity
Andererseits ist es im strengen Modus nicht konfigurierbar.
Ein einfaches n === n+1
oder n === n/0
funktioniert:
function isInfinite(n) {
return n === n/0;
}
isFinite()
Beachten Sie, dass der Native Eingaben in Zahlen erzwingt. isFinite([])
und isFinite(null)
sind beide true
zum Beispiel.
n === n+1
wird für alle Zahlen größer als 2 ^ 53, dh 1e30, als wahr ausgewertet. Der Divisions-Hack funktioniert auch für NaN und -Infinity. Die Antwort von LukeH gibt Ihnen jedoch einen besser lesbaren Code.
n+1
können sie nicht dargestellt werden und unterliegen einer Rundung. Nun, auch ganze Zahlen sind von Rundungsfehlern betroffen. Übrigens glaube ich nicht, dass Ihr Code "mathematisch" ist, versuchen Sie es einfachn === n/-0
. Wenn Sie die Reals mit +/- inf abschließen, ist Ihr Limit nicht genau definiert, es sei denn, die zugrunde liegende Nullsequenz wird als positiv angenommen.
In ES6
, der Number.isFinite()
bestimmt , ob die Methode übergebenen Wert eine endliche Zahl ist.
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
Ich benutze Lodash aus verschiedenen Gründen der defensiven Codierung sowie aus Gründen der Lesbarkeit. ES6 Number.isFinite
ist großartig und hat keine Probleme mit nicht numerischen Werten. Wenn ES6 jedoch nicht möglich ist, haben Sie bereits lodash oder möchten einen kürzeren Code: _.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
Ich bin auf ein Szenario gestoßen, in dem ich überprüfen musste, ob der Wert vom Typ NaN
oder ist, Infinity
aber Zeichenfolgen als gültige Ergebnisse übergeben habe. Da viele Textzeichenfolgen falsch positiv sind NaN
, habe ich eine einfache Lösung gefunden, um Folgendes zu umgehen:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
Der obige Code konvertiert Werte in Zeichenfolgen und prüft, ob sie streng gleich NaN oder Infinity sind (Sie müssen einen weiteren Fall für negative Unendlichkeit hinzufügen).
So:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
NaN
s usw.
toString()
stattdessen verwenden würde? Sie können gerne Gründe herabstimmen oder angeben, wie dies zu inkonsistenten Ergebnissen führen kann oder warum genau diese Methode nicht empfohlen wird. Bisher habe ich immer noch das Gefühl, dass es eine Option für jeden bietet, der nach einer Antwort sucht, und es gibt keine konkreten Gründe, warum dies gefährlich, instabil usw. ist
Sie können isFinite im Fenster verwenden.isFinite(123)
:
Sie können eine Funktion schreiben wie:
function isInfinite(num) {
return !isFinite(num);
}
Und verwenden Sie wie:
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
Sie können auch Number.isFinit
überprüfen, ob der Wert auch Number ist und genauer für die Überprüfung von undefined
undnull
etc ...
Oder Sie können polyfill es wie :
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITY
anstelle von-?Infinity
oder verwenden-?1/0
?