Sprawdzanie NaN („nie jest liczbą”) jest tak proste, jak sprawdzenie równości w JavaScript.
W JavaScript specjalna wartość
NaN
(oznaczająca„ nie jest liczbą ”) jest używana do reprezentowania wyniku obliczeń matematycznych, których nie można przedstawić jako znacząca liczba. – Joshua Clanton w kroplówce JavaScript
Specjalna wartość NaN
pojawia się w JavaScript, gdy Math
funkcje zawodzą (Math.sqrt(-37)
) lub gdy funkcja próbująca przeanalizować numer kończy się niepowodzeniem (parseInt("No integers here")
).
NaN
następnie zatruwa wszystkie inne funkcje matematyczne, prowadząc do wszystkich innych operacji matematycznych powodujących NaN
.
Zauważ, że w JavaScript dzielenie przez 0 zwraca Infinity
, a nie NaN
:
Ten wynik wynika z tego, jak zmienny-poi nt jest zdefiniowane, bardziej ogólnie niż tylko JavaScript. Dlaczego? Z grubsza, ponieważ 1/0 jest granicą 1 / x, gdy x zbliża się do zera. A 0/0 nie ma w ogóle sensownej interpretacji, stąd NaN
.
Czym w ogóle jest NaN?
NaN jest właściwością obiektu globalnego. Początkowa wartość NaN to Not-A-Number – taka sama jak wartość Number.NaN. – Dokumenty MDN
Sprawdzenie NaN jest trudniejsze niż się wydaje
Niestety, są dwa problemy z próbą sprawdzenia NaN
:
-
typeof NaN
to„ numer ” -
NaN
nie jest równe każdej innej wartości w JavaScript
Sprawdź ten przykład kodu:
Jak więc sprawdzić, czy mamy NaN
wartość, która zatruwa matematykę?
Sprawdź, czy NaN jest równy samemu sobie
” NaN i tylko NaN porównuje nierówności. ” – Dokumenty MDN
W JavaScript najlepszym sposobem sprawdzenia NaN
jest sprawdzenie równości używając jednego z wbudowanych operatorów równości, ==
lub ===
.
Ponieważ NaN
nie jest sobie równe, NaN != NaN
zawsze zwróci true
.
Oczywiście taki NaN
test w kodzie nie zawsze jest czytelny, dlatego warto użyć komentarza lub utworzyć funkcję opakowującą:
Nie ma znaczenia, jeśli używasz !=
lub !==
, aby sprawdzić NaN
.
Sprawdź NaN za pomocą Object.is ()
” The
Object.is()
określa, czy dwie wartości są takie same.”- Dokumentacja MDN
W przeciwieństwie do ścisłych i luźnych operatorów równości, metoda pomocnicza ES6 Object.is()
nie uwzględnia NaN
równy sobie:
Więc jeśli zamienisz ===
na Object.is()
, nie musisz się martwić o sprawdzaniu, czy NaN
w jakiś specjalny sposób. Problem rozwiązany!
O tym, jak używać Object.is()
w JavaScript pisałem w innym artykule:
Jedna uwaga na temat terminologii – to funkcja z globalnej klasy Object
, nie nazywam tego „operatorem równości”, jak ==
lub ===
.
Na przykład w testach Jest metoda .toBe()
, która używa ===
różni się od metody .toEqual()
, która używa Object.is()
.
Podsumowując w tym miejscu powinienem wspomnieć, że JavaScript ES6 Set
, który jest używany do znajdowania unikalnych wartości, zachowa tylko jedną kopię NaN
wartość.
Słowo o Number .isNan ()
Nowoczesny JavaScript ma już implementację sprawdzającą NaN
o nazwie Number.isNan()
, która działa tak, jak myślisz byłoby. Na przykład:
Pamiętaj, że Number.isNan()
różni się od globalnej funkcji isNan()
, która jest starszą implementacją, której rzeczywistym celem jest sprawdzenie, czy wartość nie może zostać przekształcona w liczba.
Oto różnica, jeśli chodzi o kompletność:
-
isNaN()
zwrócitrue
jeśli aktualnie wartością jestNaN
lub jeśli po przekształceniu w liczbę będzie toNaN
. Innymi słowy, jeśli otrzyma wartość, którą można przekształcić w liczbę, funkcja isNaN () zwróci wartość false. -
Number.isNaN()
zwrócitrue
tylko wtedy, gdy wartość wynosi obecnieNaN
.
Jeśli więc obsługujesz stare przeglądarki (zwłaszcza Internet Explorer), które nie obsługują Number.isNan()
, najlepiej sprawdzić, czy nie ma równości.