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?
javascript
infinity
Homer_J
źródło
źródło
Number.(POSITIVE|NEGATIVE)_INFINITY
zamiast-?Infinity
lub-?1/0
?Infinity
właściwość global nie jest tylko do odczytu, co oznacza, że można ją przedefiniować: na przykładvar x = 42; Infinity = 42; alert(x === Infinity);
wyświetla wartość „true” . (Trzeba przyznać, że to niejasny przypadek i każdy, kto zdecyduje się na przedefiniowanieInfinity
,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
iNumber.NEGATIVE_INFINITY
są tylko do odczytu (testowane na Chrome8, FF3.6 i IE8). Używanie1/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żywanieisFinite
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
lubn === 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([])
iisFinite(null)
oba sątrue
na przykład.źródło
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óbujn === 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
źródło
W rzeczywistości n === n + 1 będzie działać dla liczb większych niż 51 bitów, np
1e16 + 1 === 1e16; // true 1e16 === Infinity; // false
źródło
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
źródło
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 dodatniNaN
, 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
źródło
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 sprawdzeniaundefined
inull
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); }
źródło