Możesz użyć typeof
operatora:
var booleanValue = true;
var numericalValue = 354;
var stringValue = "This is a String";
var stringObject = new String( "This is a String Object" );
alert(typeof booleanValue) // displays "boolean"
alert(typeof numericalValue) // displays "number"
alert(typeof stringValue) // displays "string"
alert(typeof stringObject) // displays "object"
Przykład z tej strony . (Przykład został jednak nieco zmodyfikowany).
Nie będzie to działało zgodnie z oczekiwaniami w przypadku ciągów utworzonych za pomocą new String()
, ale jest to rzadko używane i zalecane przeciwko [1] [2] . Zobacz inne odpowiedzi, jak sobie z nimi poradzić, jeśli chcesz.
- Przewodnik po stylu JavaScript w Google mówi, że nigdy nie należy używać pierwotnych opakowań obiektów .
- Douglas Crockford zalecił wycofanie pierwotnych opakowań obiektów .
new String('foo')
, ale to nie ma znaczenia, ponieważ łańcuchy obiektowe są bezwartościową funkcją, której nie powinieneś używać. Przewodnik po stylu Google zabrania ich , Douglas Crockford chce, aby były przestarzałe i żadne biblioteki ich nie używają. Udawaj, że nie istnieją i używaj ichtypeof
bez strachu.typeof
też wycofania się ?Oto, co działa dla mnie:
źródło
instanceof
sprawdzanie tutaj jest bezcelowe, chyba że podążasz za jakimś bardzo niezwykłym praktyk kodowania, a ta odpowiedź nic nie wyjaśnia, co robi i dlaczego możesz go użyć. Jedynym powodem, dla którego będziesz go kiedykolwiek potrzebować, jest użycie ciągów zawijanych w obiektach, ale ciągi zawijane w obiekty są bezwartościową funkcją, której nikt nie używa, a Google i Crockford potępiają jako złą praktykę ( google-styleguide.googlecode.com/svn/ trunk /… , crockford.com/javascript/recommend.html ).typeof
iinstanceof
wydaje się dobrą radą, jeśli Twój kod może zostać wywołany przez inne osoby. @ MarkAmery'spostmessage
krawędzi znaczenie, jeśli pytasz „co ja właśniepostmessage
d?”. - ale można oczekiwać, że zostanie to obsłużone w interfejsie i nie będzie mogło się rozprzestrzeniać. Gdzie indziej, wydaje się poprawne posługiwanie się nieaktualnymi metodami kodowania, nawet jeśli niektóre estetyki JS ich nie pochwalają. NIGDY nie komentuj swojego kodu jako akceptującego String, chyba że tak naprawdę!Ponieważ ponad 580 osób głosowało na niepoprawną odpowiedź, a ponad 800 głosowało na działającą, ale podobną do strzelby odpowiedź, pomyślałem, że warto powtórzyć moją odpowiedź w prostszej formie, którą każdy może zrozumieć.
Lub inline (mam do tego konfigurację UltiSnip):
Do Twojej wiadomości, odpowiedź Pablo Santa Cruz jest zła, ponieważ
typeof new String("string")
jestobject
Odpowiedź DRAX-a jest dokładna i funkcjonalna i powinna być poprawną odpowiedzią (ponieważ Pablo Santa Cruz jest zdecydowanie niepoprawna i nie będę się kłócił przeciwko głosowaniu powszechnemu).
Jednak ta odpowiedź jest również zdecydowanie poprawna i faktycznie najlepsza odpowiedź (z wyjątkiem być może sugestii użycia lodash / podkreślenia ). zrzeczenie się odpowiedzialności: Przyczyniałem się do bazy kodu lodash 4.
Moja pierwotna odpowiedź (która oczywiście przeleciała nad wieloma głowami) brzmi:
Przekodowałem to z underscore.js:
To zdefiniuje isString, isNumber itp.
W Node.js można to zaimplementować jako moduł:
[edytuj]:
Object.prototype.toString.call(x)
działa również w celu rozdzielenia funkcji i funkcji asynchronicznych:źródło
global || window
zamiastwindow
jednak, że byłoby to złe podejście do rozwiązania problemu nie powinien mieć w pierwszej kolejności).myObject+"" === myObject
czy obiekt jest ciągiem (a nawet lepiej, nie pisałbym sprawdzania w systemie typu opartym na zachowaniu).toString
wObject.prototype
. Twierdzę więc, że poleganie natoString
sprawdzaniu typu obiektu jest w najlepszym razie złą praktyką.Polecam korzystanie z wbudowanych funkcji jQuery lub lodash / Underscore . Są prostsze w użyciu i łatwiejsze do odczytania.
Każda funkcja obsłuży wspomniany przypadek DRAX ... to znaczy oba sprawdzają, czy (A) zmienna jest literałem ciągu lub (B) jest instancją obiektu String. W obu przypadkach funkcje te poprawnie identyfikują wartość jako ciąg.
lodash / Underscore.js
jQuery
Zobacz dokumentację lodash dla _.isString (), aby uzyskać więcej informacji.
Zobacz dokumentację jQuery dla $ .type () po więcej szczegółów.
źródło
_.every()
jest trochę mylące w użyciu i coś tak prostego, jak_.isBoolean()
mylące devy w moim towarzystwie. Deweloper błędnie pomyślał, że byłoby fałszem, gdyby wartość była wartością logiczną i była fałszywa. Angielski jest dla mnie łatwiejszy do odczytania niż niemiecki, ponieważ nie znam niemieckiego. Naucz się JavaScript, a wszystko to będzie miało sens.Widziałem to tutaj:
http://perfectionkills.com/instanceof-consanted-harmful-or-how-to-write-a-robust-isarray/
źródło
Object.prototype.toString.call(obj) === '[object String]'
?(x === y)
lepszą czytelność niżx === y
?Najlepszym sposobem:
Każdy z nich został skonstruowany za pomocą odpowiedniej funkcji klasy, takiej jak „new Object ()” itp.
Ponadto, pisanie kaczką: „Jeśli wygląda jak kaczka, chodzi jak kaczka i pachnie jak kaczka - to musi być szyk”. Oznacza to, sprawdź jej właściwości.
Mam nadzieję że to pomoże.
Edytować; 12.05.2016
Pamiętaj, że zawsze możesz używać kombinacji podejść. Oto przykład użycia wbudowanej mapy działań z typof :
Oto bardziej „rzeczywisty” przykład użycia map wbudowanych:
Ta funkcja użyłaby [niestandardowego] „rzutowania typu” - raczej „mapowania typu - / - wartości” - aby dowiedzieć się, czy zmienna rzeczywiście „istnieje”. Teraz możesz rozdzielić te paskudne włosy pomiędzy
null
i0
!Wiele razy nawet nie dbasz o jego typ . Innym sposobem na uniknięcie pisania jest łączenie zestawów typu kaczka:
Oba
Number.prototype
iString.prototype
mają.toString() method
. Właśnie upewniłeś się, że ekwiwalent ciągu liczby był taki sam, a następnie upewniłeś się, że przekazałeś go dohttp
funkcji jakoNumber
. Innymi słowy, nie obchodziło nas nawet, jaki był tego typu.Mam nadzieję, że dajesz więcej do pracy :)
źródło
(o.constructor === Number || s.constructor === Boolean)
). AnegdotycznieparseInt
iNaN
są delikatnymi, ale potężnymi narzędziami. Pamiętaj tylko, że NIE-Liczba nie jest NIE-Liczba i można zdefiniować niezdefiniowany.if(thing.call) { 'its a function'; }
lubif(thing.defineProperties) { 'its an object'; }
. Dzięki za wkład, axkibe!Nie rozumiem szczerze, dlaczego
typeof
w takim przypadku nie można po prostu użyć :Tak, nie powiedzie się w przypadku łańcuchów opakowanych w obiekty (np.
new String('foo')
), Ale są one powszechnie uważane za złą praktykę i większość współczesnych narzędzi programistycznych może zniechęcać do ich używania. (Jeśli widzisz, po prostu to napraw!)Object.prototype.toString
Sztuką jest coś, co wszyscy deweloperzy front-end został uznany za winnego robi jeden dzień w ich karierze, ale nie pozwól, by oszukać jego polerowania mądry: pęknie jak tylko coś małpy plastra prototyp obiektu:źródło
Lubię używać tego prostego rozwiązania:
źródło
undefined
inull
, i wciąż uzyskania właściwej odpowiedzi dla pustych ciągów (zarówno''
inew String('')
).(mystring || false) && mystring.constructor === String
. Użyłem wartości false, jeśli jest używana w funkcji, która musi zwrócić wartość logiczną.To świetny przykład tego, dlaczego wydajność ma znaczenie:
Wykonanie czegoś tak prostego jak testowanie łańcucha może być kosztowne, jeśli nie zostanie wykonane poprawnie.
Na przykład, jeśli chciałbym napisać funkcję sprawdzającą, czy coś jest ciągiem, mógłbym to zrobić na dwa sposoby:
1)
const isString = str => (Object.prototype.toString.call(str) === '[object String]');
2)
const isString = str => ((typeof str === 'string') || (str instanceof String));
Oba są dość proste, więc co może wpłynąć na wydajność? Mówiąc ogólnie, wywołania funkcji mogą być kosztowne, szczególnie jeśli nie wiesz, co dzieje się w środku. W pierwszym przykładzie istnieje wywołanie funkcji do metody toString obiektu. W drugim przykładzie nie ma wywołań funkcji, ponieważ typeof i instanceof są operatorami. Operatory są znacznie szybsze niż wywołania funkcji.
Podczas testowania wydajności przykład 1 jest o 79% wolniejszy niż przykład 2!
Zobacz testy: https://jsperf.com/isstringtype
źródło
typeof str === 'string' || str instanceof String
(może upuścić nawias, który wolę wif (..)
przypadkach); niezależnie od tego, sprawdzanie zarówno typów pierwotnych, jak i typów obiektów w # 2 jest jasne i wystarczające. Te kontrole i tak powinny być „rzadkie”.Działa zarówno z literałami łańcuchowymi, jak
let s = 'blah'
i obiektowymilet s = new String('blah')
źródło
Pobrane z lodash:
źródło
Myślę, że rozwiązanie @customcommander powinno wystarczyć w 90% twoich przypadków:
Powinien ci dobrze służyć (po prostu dlatego, że zwykle nie ma powodu, aby to mieć)
new String('something')
w kodzie).Jeśli jesteś zainteresowany obsługą
String
obiektu (na przykład oczekujesz, że różni się od firmy trzeciej), to użycie lodash jako sugerowanej @ ClearCloud8 wydaje się jasnym, prostym i eleganckim rozwiązaniem.Sugerowałbym jednak ostrożność w stosunku do bibliotek takich jak lodash ze względu na ich wielkość. Zamiast robić
Co przynosi cały ogromny obiekt lodash, sugerowałbym coś takiego:
Z prostym pakietowaniem powinieneś być w porządku (odnoszę się tutaj do kodu klienta).
źródło
Jeśli pracujesz w środowisku node.js, możesz po prostu użyć wbudowanej funkcji isString w utils.
Edycja: jak wspomniano @Jehy, jest to przestarzałe od wersji 4.
źródło
typeof value === 'string'
zamiast”.x = new String('x'); x.isString(x);
zwraca false . Istniejeutil.types.isStringObject()
jednak wartość false dlax = 'x'
ciągu typu. Dwie funkcje narzędziowe, które absolutnie nie zapewniają żadnej użyteczności ...Poniższa metoda sprawdzi, czy jakakolwiek zmienna jest ciągiem (w tym zmienne, które nie istnieją ).
źródło
Odkryłem również, że to też działa dobrze i jest znacznie krótsze niż w innych przykładach.
Łącząc puste cudzysłowy, zamienia wartość w ciąg znaków. Jeśli
myVar
jest już ciągiem, to instrukcja if się powiodła.źródło
typeof
.typeof
ale wciąż nieco szybszy niżtoString
. Tak czy inaczej, chyba podoba mi się składnia wymuszania.var s = new String('abc'); > s === s + '' > false
new String
cus, który tworzy rodzajobject
. w3schools.com/js/tryit.asp?filename=tryjs_string_object2źródło
false
.Uważam, że ta prosta technika jest przydatna do sprawdzania typu dla String -
Ta sama technika działa również dla Number -
A dla RegExp -
To samo dla obiektu -
NB, wyrażenia regularne, tablice i funkcje są również uważane za obiekty.
Ale sprawdzanie tablicy jest nieco inne -
Ta technika nie działa jednak w przypadku funkcji -
źródło
var x = new String(x); String(x)===x
zwraca false jednak({}).toString.call(x).search(/String/)>0
zawsze wraca po sznurkifunction isClass(x,re){return ({}).toString.call(x).search(re)>0;};
isClass("hello",/String/)
lubisClass(3,/Number/)
lubisClass(null,/Null/)
Prostym rozwiązaniem byłoby:
źródło
toString()
funkcję.toString
żadnych wartości; spróbuj, jeśli x, który ma być sprawdzony, ma wartość NULL lub jest niezdefiniowany, wyjątektoString()
metoda może zostać przesłonięta i może zgłosić wyjątek (z powodu określonej implementacji), a sprawdzenie na pewno nie zadziała. Główną ideą jest to, że nie powinieneś wywoływać metod niezwiązanych z tym, co chcesz uzyskać. Nie mówię nawet o niepotrzebnych kosztach związanych z tątoString
metodą. Downvoting.Pomocnik Typechecker:
stosowanie:
Również jeśli chcesz, aby był rekurencyjny (jak tablica, która jest obiektem), możesz użyć
instanceof
.(
['cs'] instanceof Object //true
)źródło
Idę inną drogą do pozostałych tutaj, które próbują stwierdzić, czy zmienna jest konkretnym typem, czy też członkiem określonego zestawu.
JS opiera się na kaczce; jeśli coś trzeszczy jak struna, możemy i powinniśmy użyć tego jak struny.
Jest
7
ciąg? Dlaczego więc/\d/.test(7)
działa?Jest
{toString:()=>('hello there')}
ciąg? Dlaczego więc({toString:()=>('hello there')}) + '\ngeneral kenobi!'
działa?To nie są pytania, które powinny powyższe prace, chodzi o to robią.
Więc stworzyłem
duckyString()
funkcjęPoniżej testuję wiele przypadków, które nie są pokrywane przez inne odpowiedzi. Dla każdego kodu:
duckyString()
normalizację danych wejściowych dla kodu, który oczekuje rzeczywistych ciągówJest to w tym samym stylu, co
!!x
w przeciwieństwie dox===true
testowania, czy coś jest podobne do tablicy, zamiast konieczności rzeczywistej tablicy.obiekty jQuery; czy są tablice? Nie. Czy są wystarczająco dobre? Tak, możesz je dobrze uruchomić przez
Array.prototype
funkcje.Jest to elastyczność, która daje JS jego moc i testowania dla ciągów specjalnie czyni kod mniej interoperacyjne.
Wynikiem powyższego jest:
Chodzi o to, dlaczego chcesz wiedzieć, czy coś jest struną.
Jeśli, tak jak ja, przybyłeś tutaj z Google'a i chciałeś zobaczyć, czy coś jest w stylu sznurka , oto odpowiedź.
Nie jest nawet drogi, chyba że pracujesz z naprawdę długimi lub głęboko zagnieżdżonymi tablicami char.
Wynika to z faktu, że chodzi tu tylko o instrukcje if, żadne wywołania funkcji takie jak
.toString()
.Z wyjątkiem sytuacji, gdy próbujesz sprawdzić, czy tablica
toString()
znaków z obiektami, które mają tylko znaki wielobajtowe, w takim przypadku nie ma innego sposobu sprawdzenia niż wykonanie łańcucha i policzenie znaków, które bajty tworzą odpowiednioZawarte są opcje do
.toString()
)Oto więcej testów, ponieważ jestem uzupełniaczem:
Wynik:
źródło
Wystarczy, aby rozwinąć @ Drax za odpowiedź , chciałbym to zrobić:
Uwzględnia także
null
s iundefined
typy oraz zajmuje się typami nieciągłymi, takimi jak0
.źródło
To mi wystarczy.
OSTRZEŻENIE: To nie jest idealne rozwiązanie. Zobacz dół mojego postu.
I możesz użyć tego jak poniżej.
OSTRZEŻENIE: Działa to niepoprawnie w przypadku:
źródło
Możesz użyć tej funkcji do określenia rodzaju czegokolwiek:
Aby sprawdzić, czy zmienna jest ciągiem:
https://codepen.io/patodiblasi/pen/NQXPwY?editors=0012
źródło
Nie jestem pewien, czy masz na myśli wiedzieć, czy jest to typ
string
niezależnie od jego zawartości, czy też jego zawartość jest liczbą lub łańcuchem, niezależnie od jego typu.Aby wiedzieć, czy jego typ jest ciągiem, na to już odpowiedziano.
Ale żeby wiedzieć na podstawie jego zawartości, czy jest to ciąg znaków, czy liczba, użyłbym tego:
I dla niektórych przykładów:
źródło
/^\d+$/.test('123')
aby uniknąć zawiłości potencjalnych problemów z analizą)