Jak sprawdzić liczbę w JavaScript

Liczby są typem prymitywnym w JavaScript, ale samo użycie typeof nie odróżni liczb od NaN czy Infinity.

Wrzesień 23, 2019 – 6 min read

Photo by Alex Chambers on Unsplash

Przydatna jest wiedza, jak sprawdzić, czy wartość jest typu prymitywnego number, ponieważ JavaScript jest językiem dynamicznie typowanym.

Najprostszym sposobem sprawdzenia liczby jest użycie typeof, który zwróci ciąg "number" dla dowolnej wartości typu prymitywnego number, w tym NaNInfinity oraz -Infinity.

Jednym z przykładów, kiedy liczba może pojawić się jako inny typ, wskazując na błąd w moim kodzie, byłoby parsowanie waluty:

W tym przypadku wiedziałbym, że zapomniałem sparsować ciąg znaków na liczbę, gdy otrzymam wartość „string” z powrotem z typeof.

Photo by Samuel Zeller on Unsplash

Jeśli użyję parseFloat() do sprawdzenia wartości waluty, ale zapomniałem usunąć symbol waluty, otrzymam nieudany pars i dziwny wynik:

Oh, no. W tym przypadku wygląda na to, że typeof nie działa tak, jak się spodziewałem – ponieważ wartości NaN są uważane za liczby w JavaScript.

Photo by Gemma Evans on Unsplash

Gdy słowo kluczowe typeof zwraca „liczba”

Oczywistym rozwiązaniem sprawdzenia, czy typ prymitywny jest liczbą, jest użycie słowa kluczowego typeof, jak pokazałem powyżej.

Ale typeof jest niekompletnym rozwiązaniem, ze względu na dwie specjalne wartości w JavaScript: NaN („Not a Number”) oraz Infinity.

Dla mojego przykładu waluty, wiem, że mam błąd, jeśli moja wartość pieniężna jest NaN lub Infinity, ale typeof zwraca "number" dla obu tych wartości.

Prawdopodobnie moje dane wejściowe zostały napisane przy użyciu symbolu waluty, a ja po prostu próbowałem użyć parseFloat() do przechwycenia wartości. To spowodowałoby NaN:

Photo by Timo Kaiser on Unsplash

Niestandardowa funkcja isNumber()

Arobust, niestandardowa funkcja isNumber() użyłaby typeof do sprawdzenia typu prymitywnego, sprawdzenia wartości NaN i sprawdzenia wartości Infinity:

Or, w przypadku, gdy mamy pewność, że NaN i Infinity nie pojawią się, wystarczy sprawdzić, że typeof==="number".

Photo by 🇨🇭 Claudio Schwarz | @purzlbaum on Unsplash

The one-liner

Uwielbiam one-linery. Myślę, że powinny być udokumentowane komentarzami, ale myślę, że są naprawdę przydatne, a nie tylko wymyślne.

Oto one-liner, jak sprawdzić liczbę w JavaScript:

Jest jednak lepszy sposób na sprawdzenie skończonej liczby w JavaScript – funkcja pomocnicza Number.isFinite() ma takie samo zachowanie jak napisana przeze mnie niestandardowa funkcja isNumber(). Zamieszczam przykład w następnej sekcji.

Photo by Bernard Hermant on Unsplash

Najprostszy sposób na sprawdzenie, czy liczba: Number.isFinite()

Właściwie nie ma potrzeby pisania niestandardowych funkcji, aby sprawdzić, czy liczba jest liczbą, chociaż jest to pouczający sposób na zapamiętanie, że wartości JavaScript Infinity-Infinity, i NaN są wszystkie typu prymitywnego liczby.

„Metoda Number.isFinite() określa, czy przekazana wartość jest liczbą skończoną.” – MDN Docs

Metoda Number.isFinite() zwróci true dla liczb skończonych, i false dla Infinity-Infinity, i NaN – dokładnie to, co chcemy:

Istnieje również globalna funkcja isFinite(), która wykona koercję typów (np. koercję ciągów znaków na liczby), jak pokazano powyżej.

Dokładnie omawiam te metody w moim artykule na temat Infinity w The Startup:

Photo by Bogomil Mihaylov on Unsplash

Sprawdź, czy zmienna jest liczbą całkowitą

Aby sprawdzić, czy zmienna A jest liczbą całkowitą, mógłbym użyć luźnego operatora równości ==, aby sprawdzić, czy sparsowana wartość jest równa sobie.

Poniższy fragment kodu daje przykład, jak sprawdzić, czy zmienna jest liczbą całkowitą:

Użycie typeof pozwoliłoby odróżnić ciąg znaków, który jest wymuszany na liczbę, od rzeczywistej liczby, podobnie jak ścisły operator równości ===.

Photo by Markus Spiske on Unsplash

Wyodrębnij symbole walut

Dla lepszej, bardziej solidną funkcję, mogę chcieć najpierw usunąć symbole walutowe (takie jak znak dolara i przecinki).

Dokładne parsowanie pieniędzy przy użyciu wyrażeń regularnych w JavaScript wykracza poza zakres tego artykułu, ale ten kod usuwa $ i , przed parsowaniem:

Zauważ, że funkcje globalne parseInt() i parseFloat() będą koerdynowały wartości do ciągów, jeśli to konieczne, i zwrócą NaN jeśli koercja się nie powiedzie.

Istnieją również funkcje Numbers.parseInt() i Number.parseFloat(), które mają to samo dokładne zachowanie.

Według MDN Docs, te zduplikowane funkcje zostały dodane do ECMAScript 2015 dla „modularyzacji celów globali.”

Photo by Toa Heftiba on Unsplash

Czy JavaScript faktycznie ma oddzielne liczby całkowite?

Nie, JavaScript ma tylko jeden typ liczby, który jest reprezentowany wewnętrznie jako 64-bitowa reprezentacja zmiennoprzecinkowa.

Ta zmiennoprzecinkowa liczba jest prymitywnym typem danych number, i istnieje również typ zwany BigInt, który może być używany dla arbitralnie dużych liczb.

Funkcje globalne parseInt() i parseFloat() różnią się w tym, czego oczekują i co wyprowadzą, ale nie dlatego, że w JavaScript istnieją faktycznie oddzielne typy całkowite i zmiennoprzecinkowe.

Photo by Volkan Olmez on Unsplash

Wnioski

Sprawdzanie liczby w JavaScript nie jest szczególnie skomplikowane – typeof działa w zasadzie tak, jak powinno, o ile jest się świadomym, że zarówno NaN jak i Infinity posiadają typeof liczbę.

Najprostszy sposób na sprawdzenie, czy liczba jest skończona (tj. nie NaN lub Infinity) w JavaScript jest użycie Number.isFinite(), który nie wykonuje koercji wartości do liczb, lub globalnego isFinite(), który wykonuje koercję typu.

Sprawdzenie, czy dana wartość jest liczbą całkowitą, polega na użyciu funkcji parseInt(), a następnie porównaniu jej z samą sobą za pomocą == (która zamienia wartości nienumeryczne, takie jak ciągi znaków, na liczby) lub === (która zwraca wartość true tylko wtedy, gdy obie wartości są liczbami).

Pod maską, liczby całkowite i zmiennoprzecinkowe są takie same: JavaScript ma tylko jeden typ liczby, typ prymitywny number.

Photo by K. Mitch Hodge on Unsplash

Dalsza lektura

  • Funkcja Number.isInteger() nie koeruje ciągów znaków do liczb:
  • Sumit Kumar Pradhan napisał o sprawdzaniu poprawności liczb na Dev.to:
  • Chris Ferdinandi omawia parsowanie liczb na swoim blogu vanilla JS:
  • Wyrażenie regularne ^+(\.{1,2})?$ pasuje do pieniędzy:
  • Sarah Dayan napisała o parsowaniu pieniędzy w JavaScript na frontstuff:

Photo by Alejandro Ortiz on Unsplash

Dodaj komentarz

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