Jak mogę sprawdzić, czy var jest ciągiem w JavaScript?


Odpowiedzi:


380

Byłeś blisko:

if (typeof a_string === 'string') {
    // this is a string
}

Na powiązaną notatkę: powyższe sprawdzenie nie zadziała, jeśli zostanie utworzony ciąg znaków z new String('hello')typem Objectzamiast. Istnieją skomplikowane rozwiązania tego problemu, ale lepiej unikać tworzenia ciągów w ten sposób.


1
Chłopaki, naprawdę dałbym zaakceptowaną odpowiedź wam obojgu, ale nie mogę, jedyne, co mogę zrobić, to dać +1 obojgu, niż dać akceptowaną odpowiedź, kto jest bliżej mojego konkretnego problemu, czego nie w pełni wyjaśnione.
— vitto

to zadziałało dla mnieif(typeof(str) === typeof(String()))
— Scott Murphy

78

typeofOperator nie jest infix (tak LHS Twojego przykład nie ma sensu).

Musisz go tak używać ...

if (typeof a_string == 'string') {
    // This is a string.
}

Pamiętaj, typeofjest operatorem, a nie funkcją. Mimo to będziesz typeof(var)często używany na wolności. Ma to tyle samo sensu, co var a = 4 + (1).

Równie dobrze możesz użyć ==(operator porównania równości), ponieważ oba operandy są Strings ( typeof zawsze zwraca a String), JavaScript jest zdefiniowany tak, aby wykonywał te same kroki, których użyłem ===(operator ścisłego porównania).

Jak wspomina Box9 , nie wykryjeString obiektu utworzonego przez instancję .

Możesz to wykryć za pomocą ....

var isString = str instanceof String;

jsFiddle .

...lub...

var isString = str.constructor == String;

jsFiddle .

Ale to nie zadziała w wielu windowśrodowiskach (pomyśl iframe).

Możesz to obejść dzięki ...

var isString = Object.prototype.toString.call(str) == '[object String]';

jsFiddle .

Ale znowu (jak wspomina Box9 ), lepiej jest po prostu użyć Stringformatu dosłownego , np var str = 'I am a string';.

Dalsza lektura .


1
@ Box9 Nie martw się, i tak jestem ograniczony do rep: P
— Alex

@alex Ja też jestem teraz: o (jeszcze 10 minut!)
— David Tang

3
@RobG Ograniczenie liczby powtórzeń ma miejsce, gdy uzyskasz maksymalną liczbę powtórzeń w ciągu 24 godzin. Po tym, głosy poparcia nie liczą się do twojej reputacji.
— alex

Czy nie można sprawdzić, czy zmienna jest łańcuchem, po prostu testując obecność elementu, który mają tylko łańcuchy? Na przykład if(myVar.toUpperCase) alert('I am a string');:? Zobacz: jsfiddle.net/tb3t4nsx
— ingredient_15939

1
@ component_15939 to nie jest naprawdę dobry sposób ... z powodu{ toUpperCase: '' }
— Alexa

14

Połączenie poprzednich odpowiedzi zapewnia następujące rozwiązania:

if (typeof str == 'string' || str instanceof String)

lub

Object.prototype.toString.call(str) == '[object String]'

4

Poniższe wyrażenie zwraca true :

'qwe'.constructor === String

Poniższe wyrażenie zwraca true :

typeof 'qwe' === 'string'

Poniższe wyrażenie zwraca false (sic!):

typeof new String('qwe') === 'string'

Poniższe wyrażenie zwraca true :

typeof new String('qwe').valueOf() === 'string'

Najlepsza i właściwa droga ( imho ):

if (someVariable.constructor === String) {
   ...
}

1

Teraz dni, uważam, że lepiej jest użyć funkcji typu typeof (), więc ...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}

nie ma żadnej formy funkcji typeof, tylko kontrolujesz kolejność operacji za pomocą tych nawiasów. Niektóre osoby mogą uznać ją za bardziej czytelną w pewnych okolicznościach.
— Jon z

@Jonz Co miałeś na myśli przez „kontrolowanie kolejności operacji”? Dzięki.
— a20

Myślę, że później zdałem sobie sprawę, że możesz sprawdzić konstruktora i preferować go, ponieważ teoretycznie myślałem, że będzie szybszy, ale nie jest szybszy? Przykład 4 tutaj pokazuje użycie nawiasów developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… jest zdecydowanie bardziej czytelny i mniej do rozważenia podczas analizy kompilatora. Domyślam się, że „kolejność” jest prawdopodobnie kwestią prędkości lub związana z tym, jak kompilator ładuje stos argumentów, nie jestem pewien.
— Mistrz James

1
@ a20 kolejność operacji opisuje kolejność wykonywania operacji dla instrukcji zawierających wiele operacji. Zobacz developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - nawiasy (grupowanie operacyjne) mają najwyższy priorytet dla operatorów i dlatego są najpierw oceniane. W tym przypadku nawiasy wokół filenamegrupują tylko jedną instrukcję, a zatem są bezużyteczne i obce. Dobrze, że ta odpowiedź ma 0, ponieważ jest błędna, myląca i nieprzydatna; byłoby lepiej, gdyby miał wynik ujemny.
— Jon z

Bardzo pouczające podziękowania za link. Więc nawiasy są sprawdzane i uruchamiane jako pierwsze? więc to powinno od razu uciec bez sprawdzania innych sposobów wywoływania aka bez nawiasów, co byłoby krokami później i wolniej? Nie? czego nie rozumiem na temat kompilatora środowiska wykonawczego.
— Mistrz James

0

sprawdzaj, czy we wszystkich przypadkach jest pusty lub niezdefiniowany a_string

if (a_string && typeof a_string === 'string') {
    // this is a string and it is not null or undefined.
}

typeof nulli typeof undefinednigdy nie wróci 'string', więc typeof a_stringwystarczy. Przepraszamy za nekropostę
— Ivan Frolov

-3

Moje osobiste podejście, które wydaje się sprawdzać we wszystkich przypadkach, polega na testowaniu obecności członków, którzy wszyscy będą obecni tylko dla łańcuchów.

function isString(x) {
    return (typeof x == 'string' || typeof x == 'object' && x.toUpperCase && x.substr && x.charAt && x.trim && x.replace ? true : false);
}

Zobacz: http://jsfiddle.net/x75uy0o6/

Chciałbym wiedzieć, czy ta metoda ma wady, ale od lat dobrze mi służy.


2
Można to łatwo oszukać przez każdy stary obiekt, który ma te metody.
— alex

8
Nazywa się to pisaniem kaczek - np. Jeśli chodzi jak struna i mówi jak struna, równie dobrze może być struną. Trochę zwariowałeś, jeśli uważasz, że to najlepszy sposób na przetestowanie łańcucha, ale Javascript to Thunderdome.
— Jon z
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.