Czy ktoś wie, jak mogę sprawdzić, czy zmienna jest liczbą lub łańcuchem w JavaScript?
javascript
types
Jin Yong
źródło
źródło
Odpowiedzi:
Jeśli masz do czynienia z notacją dosłownym, a nie konstruktorów, można użyć typeof .
Jeśli tworzysz liczb i ciągów za pomocą konstruktora, takie jak
var foo = new String("foo")
, należy pamiętać, żetypeof
może wrócićobject
dofoo
.Być może bardziej niezawodną metodą sprawdzania typu byłoby użycie metody znalezionej w underscore.js (źródło adnotacji można znaleźć tutaj ),
Zwraca wartość logiczną
true
dla następujących elementów:źródło
var myString = new String("stuff I like"); isString(myString)
zwracała wartość false. Ponadto nie jestem do końca pewien, jak długo trwa konwersja backgroiund, wiem, kiedy nazywam „hi” .length, „hi” zostaje przekształcony w obiekt, nie jestem pewien, jak szybko zostanie ponownie przekonwertowany lub czy jest on kiedykolwiek związany do zmiennej.Najlepszym sposobem na to jest użycie
isNaN
rzutowania typu +:Zaktualizowana metoda all-in:
To samo za pomocą wyrażenia regularnego:
źródło
null
jest przymuszane do 0 i zwraca wartość true dlaisNumber(null);
function is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
Najlepszym sposobem, jaki znalazłem, jest sprawdzenie metody w ciągu znaków, tj .:
lub jeśli chcesz zrobić coś ze sprawdzaniem liczby dla właściwości liczbowej,
To jest coś w rodzaju „pisania kaczki”, od ciebie zależy, który sposób ma największy sens. Nie mam wystarczająco dużo karmy, aby komentować, ale typof nie powiedzie się w przypadku ciągów i liczb w pudełku, tj .:
ostrzeże „obiekt”.
źródło
typeof
zawsze, ponieważ może zawsze sprawdzać ciąg znaków, zarówno pierwotny, jak i obiekt String. Musisz tylko przetestować metodę, która jest unikalna dla wybranego typu.{substring:"hello"}
. Wiem, że dla moich celów właśnie przetestowałem, co konkretna operacja muszę zrobić (moduł) dla typu, który musiałem sprawdzić (moduł ciągów zwraca niezdefiniowany), a następnie sprawdziłem to, zamiast uzyskać jego typ.Poszukujesz
isNaN()
:Zobacz JavaScript isNaN () Funkcja w MDN.
źródło
isNaN
zwracafalse
zanull
(aletrue
zaundefined
).Sprawdź, czy wartość jest literałem ciągu lub obiektem String:
Test jednostkowy:
Sprawdzanie numeru jest podobne:
źródło
function is (type, value) { return value["constructor"] === type; }
?Od ES2015 poprawnym sposobem sprawdzenia, czy zmienna zawiera prawidłową liczbę, jest
Number.isFinite(value)
Przykłady:
źródło
Spróbuj tego,
źródło
Najlepszy sposób to zrobić:
Spełnia to następujące przypadki testowe:
źródło
Lub dostosuj, aby zwrócić nieznany typ:
Aktualizacja z 12 maja 2012: Pełny przykład w Javascript: A Better typeof .
źródło
realTypeOf
:realTypeOf(NaN) -> "Number"
takie samo zachowanie, jaktypeof
uzgodniono, ale wciąż dalekie od ideału.Oto podejście oparte na idei wymuszania wprowadzania danych na liczbę lub ciąg znaków przez dodanie zera lub ciągu zerowego, a następnie wykonanie wpisanego porównania równości.
Z jakiegoś niezgłębionego powodu
x===x+0
wydaje się działać lepiej niżx===+x
.Czy są jakieś przypadki, w których nie udaje się
W tej samej żyle:
Wydaje się to być nieco szybsze niż którekolwiek
x===true || x===false
lubtypeof x==="boolean"
(i znacznie szybsze niżx===Boolean(x)
).Potem jest też
Wszystko to zależy od istnienia operacji „tożsamości” specyficznej dla każdego typu, która może być zastosowana do dowolnej wartości i niezawodnie wytworzy wartość danego typu. Nie mogę wymyślić takiej operacji dla dat.
Dla NaN istnieje
Jest to w zasadzie wersja podkreślenia, a na obecnym
isNaN()
etapie jest około czterokrotnie szybsza niż , ale komentarze w źródle podkreślenia wspominają, że „NaN jest jedyną liczbą, która sama się nie równa” i dodaje kontrolę dla _.isNumber. Dlaczego? Jakie inne przedmioty nie byłyby sobie równe? Używa również podkreślenia -x !== +x
ale jaka to różnica+
tutaj zrobić?Następnie dla paranoika:
albo to
źródło
Czy możesz to po prostu podzielić przez 1?
Zakładam, że problemem byłby ciąg znaków wejściowych takich jak: „123ABG”
Właśnie tak zrobiłem ostatnio.
źródło
a może po prostu:
Po dalszej analizie wiele miesięcy później, ta jedyna gwarancja
obj
to obiekt, który matoLowerCase
zdefiniowaną nazwę metody lub właściwości . Wstydzę się swojej odpowiedzi. Zobacz najlepiej głosowanytypeof
.źródło
Lub po prostu użyj odwrócenia
isNaN()
:I tak, korzystanie z jQuery's
$.isNumeric()
daje więcej zabawy.źródło
isNaN('123')
daje false, chociaż argument jest ciągiem liczbowym, a nie typem liczbowymMyślę, że konwersja var na ciąg zmniejsza wydajność, przynajmniej ten test przeprowadzony w najnowszych przeglądarkach tak pokazuje.
Więc jeśli zależy Ci na wydajności, skorzystałbym z tego:
do sprawdzania, czy zmienna jest ciągiem (nawet jeśli używasz
var str = new String("foo")
,str instanceof String
zwróci true).Jeśli chodzi o sprawdzenie, czy jest to liczba, wybrałbym natywną
isNaN
:; funkcjonować.źródło
jQuery używa tego:
źródło
To rozwiązanie rozwiązuje wiele podniesionych tutaj problemów!
Jest to zdecydowanie najbardziej niezawodna metoda, z której dotychczas korzystałem. Nie wymyśliłem tego i nie pamiętam, gdzie go pierwotnie znalazłem. Ale działa tam, gdzie zawodzą inne techniki:
Przykład poprawności
źródło
typeof
metody natywnej (0,788s w porównaniu do 1,481s) w Chrome. Jest to z pewnością akceptowalna wydajność, biorąc pod uwagę lepsze wyniki. Jak myślisz, dlaczego jest „naprawdę wolny”? Może tak jest - w IE6 / 7/8? Ale w tych przeglądarkach wszystko jest „naprawdę wolne”.typeof
jest 100 razy szybszy, czego mi brakuje?Jsut an FYI, jeśli używasz jQuery, masz
poradzić sobie z tym. Więcej informacji na http://api.jquery.com/jQuery.isNumeric/
źródło
typeof w większości przypadków działa bardzo dobrze. Możesz spróbować użyć instrukcji if
gdzie x to dowolna nazwa zmiennej do wyboru
źródło
najlepszy sposób, w jaki myślę o liczbach dodatnich i ujemnych, to: O'Reilly Javascript i DHTML Cookbook :
}
źródło
Errr? Wystarczy użyć wyrażeń regularnych! :)
źródło
ponieważ ciąg jako „1234” z typof pokaże „ciąg”, a odwrotność nigdy nie może się zdarzyć (typof 123 zawsze będzie liczbą), najlepiej jest użyć prostego wyrażenia regularnego
/^\-?\d+$/.test(var)
. Lub bardziej zaawansowane dopasowanie liczb zmiennoprzecinkowych, liczb całkowitych i liczb ujemnych/^[\-\+]?[\d]+\.?(\d+)?$/
. Ważną stroną.test
jest to, że NIE rzuca wyjątku, jeśli var nie jest łańcuchem, wartość może być dowolna.Jeśli szukasz prawdziwego typu, wystarczy sam typof.
źródło
@ Odpowiedź BitOfUniverse jest dobra i wymyśliłem nowy sposób:
Wiem, że
0
nie może być dywidendy, ale tutaj funkcja działa idealnie.źródło
Sprawdzanie typu
Możesz sprawdzić typ zmiennej za pomocą
typeof
operatora:Sprawdzanie wartości
Poniższy kod zwraca true dla liczb i false dla czegokolwiek innego:
źródło
typeof
operatora! @JustAMartinnumber
ale jeśli podam „123”, „abc” lub inny cytowany literał, jest to ciąg znaków i nie ma znaczenia, czy można go parsować na liczbę, czy nie.Za pomocą operacji XOR można wykryć liczbę lub ciąg znaków. liczba ^ 0 zawsze będzie podawać liczbę jako wynik, a ciąg ^ 0 da 0 jako wynik.
źródło
Prosty i dokładny:
Przypadki testowe:
źródło
Po prostu użyj
lub
jeśli chcesz obsługiwać ciągi zdefiniowane jako obiekty lub literały i zapisywać, nie chcesz używać funkcji pomocniczej.
źródło
źródło
Bardzo późno na imprezę; jednak poniższe elementy zawsze działały dla mnie dobrze, gdy chcę sprawdzić, czy dane wejściowe są ciągiem znaków lub liczbą w jednym ujęciu.
źródło
Utworzono jsperf podczas sprawdzania, czy zmienna jest liczbą. Dość ciekawe! typeof faktycznie ma wydajność. Używanie
typeof
do czegokolwiek innego niż liczby, ogólnie idzie o 1/3 prędkości jakovariable.constructor
ponieważ większość typów danych w javascript to Obiekty; liczby nie są!http://jsperf.com/jemiloii-fastest-method-to-check-if-type-is-a-number
typeof variable === 'number'
| najszybszy | jeśli chcesz numer, na przykład 5, a nie „5”typeof parseFloat(variable) === 'number'
| najszybszy | jeśli chcesz numer, taki jak 5 i „5”isNaN()
jest wolniejszy, ale nie tak dużo wolniejszy. Miałem wielkie nadziejeparseInt
iparseFloat
były one jednak strasznie wolniejsze.źródło
Do wykrywania liczb istotny jest następujący fragment z JavaScript: Dobre części Douglasa Crockforda:
źródło