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 NaNto„ numer ” -
NaNnie 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ócitruejeśli aktualnie wartością jestNaNlub 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ócitruetylko 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.