Wie kann ich überprüfen, ob eine Variable eine Zeichenfolge in JavaScript ist?
Ich habe es versucht und es funktioniert nicht ...
var a_string = "Hello, I'm a string.";
if (a_string typeof 'string') {
// this is a string
}
Wie kann ich überprüfen, ob eine Variable eine Zeichenfolge in JavaScript ist?
Ich habe es versucht und es funktioniert nicht ...
var a_string = "Hello, I'm a string.";
if (a_string typeof 'string') {
// this is a string
}
Antworten:
Du warst nah:
if (typeof a_string === 'string') {
// this is a string
}
In einem verwandten Hinweis: Die obige Prüfung funktioniert nicht, wenn stattdessen eine Zeichenfolge mit new String('hello')
dem Typ erstellt wird Object
. Es gibt komplizierte Lösungen, um dies zu umgehen, aber es ist besser, niemals zu vermeiden, dass auf diese Weise Zeichenfolgen erstellt werden.
if(typeof(str) === typeof(String()))
Das typeof
Operator ist kein Infix (daher macht die LHS Ihres Beispiels keinen Sinn).
Sie müssen es so verwenden ...
if (typeof a_string == 'string') {
// This is a string.
}
Denken Sie daran, typeof
ist ein Operator, keine Funktion. Trotzdem werden Sie sehen, typeof(var)
dass es in freier Wildbahn häufig verwendet wird. Das macht genauso viel Sinn wievar a = 4 + (1)
.
Sie können auch ==
(Gleichheitsvergleichsoperator) verwenden, da beide Operanden String
s sind ( typeof
immer a zurückgibt String
). JavaScript ist so definiert, dass es dieselben Schritte ausführt, die ich verwendet habe===
(strikter Vergleichsoperator).
Wie in Box9 erwähnt , wird dadurch keine Instanziierung erkanntString
Objekt .
Das erkennen Sie daran mit ....
var isString = str instanceof String;
jsFiddle .
...oder...
var isString = str.constructor == String;
jsFiddle .
Aber das wird nicht in einer Multi arbeitet window
Umgebung (Think iframe
s).
Sie können dies umgehen mit ...
var isString = Object.prototype.toString.call(str) == '[object String]';
jsFiddle .
Aber auch hier (wie in Box9 erwähnt ) ist es besser, nur das Literalformat zuString
verwenden, z var str = 'I am a string';
.
if(myVar.toUpperCase) alert('I am a string');
? Siehe: jsfiddle.net/tb3t4nsx
{ toUpperCase: '' }
Der folgende Ausdruck gibt true zurück :
'qwe'.constructor === String
Der folgende Ausdruck gibt true zurück :
typeof 'qwe' === 'string'
Der folgende Ausdruck gibt false zurück (sic!):
typeof new String('qwe') === 'string'
Der folgende Ausdruck gibt true zurück :
typeof new String('qwe').valueOf() === 'string'
Bester und richtiger Weg ( imho ):
if (someVariable.constructor === String) {
...
}
Heutzutage glaube ich, dass es bevorzugt ist, eine Funktionsform von typeof () zu verwenden, also ...
if(filename === undefined || typeof(filename) !== "string" || filename === "") {
console.log("no filename aborted.");
return;
}
typeof
. Sie steuern lediglich die Reihenfolge der Operationen mit diesen Klammern. Einige Leute finden es unter bestimmten Umständen besser lesbar.
filename
gruppieren die Klammern nur eine einzelne Anweisung und sind daher nutzlos und irrelevant. Es ist gut, dass diese Antwort eine Punktzahl von 0 hat, weil sie falsch, irreführend und nicht hilfreich ist. Es wäre besser, wenn es eine negative Punktzahl hätte.
in allen Fällen auf null oder undefiniert prüfen a_string
if (a_string && typeof a_string === 'string') {
// this is a string and it is not null or undefined.
}
typeof null
und typeof undefined
wird nie zurückkehren 'string'
, so typeof a_string
ist genug. Entschuldigung für die Nekropostierung
Mein persönlicher Ansatz, der in allen Fällen zu funktionieren scheint, besteht darin, die Anwesenheit von Mitgliedern zu testen, die alle nur für Zeichenfolgen anwesend sind.
function isString(x) {
return (typeof x == 'string' || typeof x == 'object' && x.toUpperCase && x.substr && x.charAt && x.trim && x.replace ? true : false);
}
Sehen: http://jsfiddle.net/x75uy0o6/
Ich würde gerne wissen, ob diese Methode Mängel aufweist, aber sie hat mir jahrelang gute Dienste geleistet.