Liczby są typem prymitywnym w JavaScript, ale samo użycie typeof nie odróżni liczb od NaN czy Infinity.
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 NaN
Infinity
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
.
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.
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
:
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"
.
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.
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:
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 ===
.
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.”
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.
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.
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: