Jak sprawdzić NaN w JavaScript

Sprawdzanie NaN („nie jest liczbą”) jest tak proste, jak sprawdzenie równości w JavaScript.

Dr Derek Austin 🥳

Obserwuj

15 września 2019 · 4 min czytania

Zdjęcie: Rattap na Unsplash

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.

Zdjęcie autorstwa Chrisa Barbalisa na Unsplash

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

Zdjęcie Andrew Buchanana na Unsplash

Sprawdzenie NaN jest trudniejsze niż się wydaje

Niestety, są dwa problemy z próbą sprawdzenia NaN:

  1. typeof NaN to„ numer ”
  2. 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ę?

Zdjęcie Wolfganga Rottmanna na Unsplash

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.

Zdjęcie Erika Mcleana na Unsplash

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ść.

Zdjęcie: Tony Hand na Unsplash

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óci true jeśli aktualnie wartością jest NaN lub jeśli po przekształceniu w liczbę będzie to NaN. Innymi słowy, jeśli otrzyma wartość, którą można przekształcić w liczbę, funkcja isNaN () zwróci wartość false.
  • Number.isNaN() zwróci true tylko wtedy, gdy wartość wynosi obecnie NaN.

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.

Zdjęcie: Nick Hillier on Unsplash

Leave a Reply

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *