Mam szereg obliczeń Javascript, które (tylko w IE) pokazują Infinity w zależności od wyborów użytkownika.
Jak zatrzymać Infinity
pojawianie się słowa i na przykład pokazać 0.0
zamiast niego?
Odpowiedzi:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
Możesz isFinite
zamiast tego użyć tej funkcji, w zależności od tego, jak chcesz leczyć NaN
. isFinite
zwraca, false
jeśli Twój numer to POSITIVE_INFINITY
, NEGATIVE_INFINITY
lub NaN
.
if (isFinite(result))
{
// ...
}
Infinity
właściwość global nie jest tylko do odczytu, co oznacza, że można ją przedefiniować: na przykład var x = 42; Infinity = 42; alert(x === Infinity);
wyświetla wartość „true” . (Trzeba przyznać, że to niejasny przypadek i każdy, kto zdecyduje się na przedefiniowanie Infinity
, NaN
itp., Powinien spodziewać się dziwnych rzeczy.)
Number.(POSITIVE|NEGATIVE)_INFINITY
nie jest tylko do odczytu , Infinity
jest tylko do odczytu w trybie ścisłym. A co z -?1/0
przypadkiem, który ci przedstawiłem? W każdym razie prawie zawsze powinieneś używać isFinite
zamiast tego.
Number.POSITIVE_INFINITY
i Number.NEGATIVE_INFINITY
są tylko do odczytu (testowane na Chrome8, FF3.6 i IE8). Używanie 1/0
działa dobrze, ale dla opiekunów Twojego kodu nie będzie to takie oczywiste, do czego faktycznie próbujesz testować. Zgadzam się, że używanie isFinite
jest prawie zawsze lepszym sposobem robienia rzeczy - dlatego wspomniałem o tym w mojej odpowiedzi - ale tylko PO może zdecydować, czy spełnia jego wymagania.
Object.defineProperty
i __defineGetter__
. Infinity
Z drugiej strony, jest non-konfigurowane w trybie ścisłym.
Prosty n === n+1
lub n === n/0
działa:
function isInfinite(n) {
return n === n/0;
}
Należy pamiętać, że natywny isFinite()
przekształca dane wejściowe do liczb. isFinite([])
i isFinite(null)
oba są true
na przykład.
n === n+1
zwraca wartość true dla wszystkich liczb większych niż 2 ^ 53, tj. 1e30. Podział działa, nawet dla NaN i -Infinity. Jednak odpowiedź LukeHa daje bardzo czytelny kod.
n+1
nie mogą być reprezentowane i podlegają zaokrąglaniu. Cóż, nawet liczby całkowite podlegają błędom zaokrągleń. Przy okazji, nie sądzę, żeby twój kod był "matematyczny", po prostu spróbuj n === n/-0
. Podczas uzupełniania liczb rzeczywistych z +/- inf, twój limit nie jest dobrze zdefiniowany, chyba że zakłada się, że podstawowa sekwencja zerowa jest dodatnia.
W ES6
, Number.isFinite()
Metoda określa, czy przekazana wartość jest liczbą skończoną.
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
Lubię używać Lodash z różnych powodów związanych z obroną kodowania, a także z powodu czytelności. ES6 Number.isFinite
jest świetny i nie ma problemów z wartościami nienumerycznymi, ale jeśli ES6 nie jest możliwy, masz już lodash lub chcesz krótszy kod: _.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
Wpadłem na scenariusz, który wymagał ode mnie sprawdzenia, czy wartość jest typu NaN
lub, Infinity
ale przekazanie ciągów znaków jako prawidłowe wyniki. Ponieważ wiele ciągów tekstowych daje wynik fałszywie dodatni NaN
, opracowałem proste rozwiązanie, aby obejść ten problem:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
Powyższy kod konwertuje wartości na łańcuchy i sprawdza, czy są one ściśle równe NaN lub Nieskończoność (musisz dodać kolejny przypadek dla ujemnej nieskończoności).
Więc:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
NaN
s itp.
toString()
zamiast tego użył ? Możesz głosować przeciw lub podać powody, dla których może to przynieść niespójne wyniki lub dlaczego dokładnie ta metoda nie jest zalecana. Jak dotąd nadal czuję, że dodaje opcję dla każdego, kto szuka odpowiedzi i nie ma żadnych konkretnych powodów, dla których jest to niebezpieczne, niestabilne itp.
Możesz użyć isFinite w oknie isFinite(123)
:
Możesz napisać funkcję taką jak:
function isInfinite(num) {
return !isFinite(num);
}
I używaj jak:
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
Można również Number.isFinit
E, która również sprawdzić, czy wartość jest zbyt Number i jest bardziej dokładna dla sprawdzenia undefined
i null
etc ...
Lub możesz wypełnić go w następujący sposób:
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITY
zamiast-?Infinity
lub-?1/0
?