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.