Wie kann ich überprüfen, ob eine Variable eine Zeichenfolge in JavaScript ist?

Antworten:

379

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.

David Tang
quelle
1
Leute, ich würde euch beiden wirklich eine akzeptierte Antwort geben, aber ich kann nicht, alles was ich tun kann ist +1 für beide, als die akzeptierte Antwort zu geben, wer meinem spezifischen Problem näher ist, was ich nicht habe vollständig erklärt.
Vitto
Das hat bei mir funktioniertif(typeof(str) === typeof(String()))
Scott Murphy
78

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, typeofist 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 Strings 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 windowUmgebung (Think iframes).

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';.

Weiterführende Literatur .

Alex
quelle
1
@ Box9 Keine Sorge, ich bin sowieso Repräsentant: P
Alex
@alex Ich bin jetzt auch: o (noch 10 Minuten!)
David Tang
3
@RobG Rep capped ist, wenn Sie die maximale Wiederholung für einen Zeitraum von 24 Stunden erreicht haben. Danach zählen Upvotes nicht mehr zu Ihrem Ruf.
Alex
Ist es nicht möglich zu überprüfen, ob eine Variable eine Zeichenfolge ist, indem einfach geprüft wird, ob ein Mitglied vorhanden ist, das nur Zeichenfolgen enthält? Zum Beispiel : if(myVar.toUpperCase) alert('I am a string');? Siehe: jsfiddle.net/tb3t4nsx
ingredient_15939
1
@ ingredient_15939 es nicht wirklich ein guter Weg ist ... wegen{ toUpperCase: '' }
alex
14

Die Kombination der vorherigen Antworten bietet folgende Lösungen:

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

oder

Object.prototype.toString.call(str) == '[object String]'
Alf Eaton
quelle
4

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) {
   ...
}
Redisko
quelle
1

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;
}
Meister James
quelle
Es gibt keine Funktionsform von typeof. Sie steuern lediglich die Reihenfolge der Operationen mit diesen Klammern. Einige Leute finden es unter bestimmten Umständen besser lesbar.
Jon z
@ Jonz Was meintest du mit "Kontrolle der Reihenfolge der Operationen"? Vielen Dank.
A20
Ich denke, später wurde mir klar, dass Sie den Konstruktor überprüfen und bevorzugen können, da ich theoretisch dachte, er wäre schneller, aber nicht schneller? Beispiel Nummer 4 zeigt hier die Verwendung von Klammern. Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Es ist definitiv besser lesbar und weniger für eine Compiler-Analyse zu berücksichtigen. Meine Vermutung über die 'Reihenfolge' ist möglicherweise ein Geschwindigkeitsproblem oder hängt damit zusammen, wie der Compiler den Argumentstapel lädt. Ich bin mir nicht sicher.
Meister James
1
@ a20 Reihenfolge der Operationen beschreibt die Reihenfolge, in der Operationen für Anweisungen ausgeführt werden, die mehrere Operationen enthalten. Sehen developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - Klammern (Betriebsgruppierung) haben die höchste Operatorrangfolge und werden daher zuerst ausgewertet. In diesem Fall filenamegruppieren 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.
Jon z
Sehr informativ danke für den Link. Also werden die Klammern zuerst überprüft und ausgeführt? das sollte also sofort laufen, ohne als nächstes nach anderen Möglichkeiten zu suchen, aka ohne Klammern aufzurufen, was wäre Schritte später und langsamer? Nein? Was verstehe ich nicht über den Laufzeit-Compiler dort.
Meister James
0

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.
}
Kurkula
quelle
typeof nullund typeof undefinedwird nie zurückkehren 'string', so typeof a_stringist genug. Entschuldigung für die Nekropostierung
Ivan Frolov
-3

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.

Zutat_15939
quelle
2
Dies lässt sich leicht von jedem alten Objekt täuschen, das über diese Methoden verfügt.
Alex
8
Dies wird als Ententypisierung bezeichnet. Wenn es beispielsweise wie eine Zeichenfolge läuft und wie eine Zeichenfolge spricht, kann es sich auch um eine Zeichenfolge handeln. Du bist ein bisschen verrückt, wenn du denkst, dass dies der beste Weg ist, einen String zu testen, aber Javascript ist ein Thunderdome.
Jon z