Odpowiedzi:
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 Object
zamiast. Istnieją skomplikowane rozwiązania tego problemu, ale lepiej unikać tworzenia ciągów w ten sposób.
if(typeof(str) === typeof(String()))
typeof
Operator 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, typeof
jest 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ą String
s ( 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ć String
formatu dosłownego , np var str = 'I am a string';
.
if(myVar.toUpperCase) alert('I am a string');
:? Zobacz: jsfiddle.net/tb3t4nsx
{ toUpperCase: '' }
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) {
...
}
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;
}
typeof
, tylko kontrolujesz kolejność operacji za pomocą tych nawiasów. Niektóre osoby mogą uznać ją za bardziej czytelną w pewnych okolicznościach.
filename
grupują 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.
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 null
i typeof undefined
nigdy nie wróci 'string'
, więc typeof a_string
wystarczy. Przepraszamy za nekropostę
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.