Ich habe eine Reihe von Javascript-Berechnungen, die (nur unter IE) je nach Benutzerauswahl Infinity anzeigen.
Wie stoppt man das Infinity
Erscheinen des Wortes und zeigt es 0.0
stattdessen?
javascript
infinity
Homer_J
quelle
quelle
Number.(POSITIVE|NEGATIVE)_INFINITY
anstelle von-?Infinity
oder verwenden-?1/0
?Infinity
Eigenschaft nicht schreibgeschützt , was bedeutet , dass sie neu definiert werden kann: Zum Beispielvar x = 42; Infinity = 42; alert(x === Infinity);
zeigt „true“ . (Zugegeben, das ist ein dunkler Fall, und jeder, der sich für eine Neudefinition usw. entscheidetInfinity
,NaN
sollte damit rechnen , dass seltsame Dinge passieren.)Number.(POSITIVE|NEGATIVE)_INFINITY
es auch nicht schreibgeschütztInfinity
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 immerisFinite
stattdessen verwenden.Number.POSITIVE_INFINITY
undNumber.NEGATIVE_INFINITY
sind schreibgeschützt (getestet auf Chrome8, FF3.6 und IE8). Die Verwendung1/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 VerwendungisFinite
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
odern === n/0
funktioniert:isFinite()
Beachten Sie, dass der Native Eingaben in Zahlen erzwingt.isFinite([])
undisFinite(null)
sind beidetrue
zum Beispiel.quelle
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
, derNumber.isFinite()
bestimmt , ob die Methode übergebenen Wert eine endliche Zahl ist.quelle
Tatsächlich funktioniert n === n + 1 für Zahlen größer als 51 Bit, z
quelle
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: _.isFinitequelle
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 sindNaN
, habe ich eine einfache Lösung gefunden, um Folgendes zu umgehen: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:
quelle
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. istSie können isFinite im Fenster verwenden.
isFinite(123)
:Sie können eine Funktion schreiben wie:
Und verwenden Sie wie:
Sie können auch
Number.isFinit
überprüfen, ob der Wert auch Number ist und genauer für die Überprüfung vonundefined
undnull
etc ...Oder Sie können polyfill es wie :
quelle