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

Lesezeit: 7 Minuten

Benutzer-Avatar
Vitto

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

Ich habe das versucht und es funktioniert nicht…

var a_string = "Hello, I'm a string.";

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

  • mögliches Duplikat von Prüfen Sie, ob die Variable in Javascript eine Zahl oder eine Zeichenfolge ist

    – Schwach

    21. August 2015 um 20:12 Uhr

  • Dies ist auch ein Duplikat von Check if a variable is a string in JavaScript

    – Alf Eaton

    11. September 2020 um 13:41 Uhr


Du warst nah:

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

In einem verwandten Hinweis: Die obige Überprüfung funktioniert nicht, wenn eine Zeichenfolge mit erstellt wird new String('hello') wie der Typ sein wird Object stattdessen. Es gibt komplizierte Lösungen, um dies zu umgehen, aber es ist besser, niemals Strings auf diese Weise zu erstellen.

  • Leute, ich würde euch beiden wirklich eine akzeptierte Antwort geben, aber ich kann nicht, ich kann nur beiden +1 geben, als die akzeptierte Antwort zu geben, wer meinem spezifischen Problem näher kommt als ich nicht vollständig erklärt.

    – Vito

    9. Juni 2011 um 0:04 Uhr

  • das hat bei mir funktioniert if(typeof(str) === typeof(String()))

    – Scott Murphy

    23. Februar 2017 um 21:25 Uhr


  • String() gibt einen String zurück, aber new String() gibt ein Objekt zurück

    – NiemandWichtig

    1. Mai um 16:39 Uhr

Benutzer-Avatar
Alex

Das typeof operator ist kein Infix (also 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) viel in freier Wildbahn verwendet. Das macht so viel Sinn wie var a = 4 + (1).

Außerdem können Sie auch verwenden == (Gleichheitsvergleichsoperator), da beide Operanden sind Strings (typeof stets gibt a zurück String), JavaScript ist so definiert, dass es die gleichen Schritte ausführt, die ich verwendet habe === (strenger Vergleichsoperator).

Wie Box9 erwähnt, dies wird nicht erkennen eine Instanziierung String Objekt.

Das erkennt man mit ….

var isString = str instanceof String;

jsFiddle.

…oder…

var isString = str.constructor == String;

jsFiddle.

Aber bei einem Multi geht das nicht window Umgebung (denke iframes).

Das kannst du umgehen mit…

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

jsFiddle.

Aber noch einmal (wie Box9 erwähnt), Sie sind besser dran, wenn Sie einfach das Literal verwenden String formatieren, z var str="I am a string";.

Weiterführende Lektüre.

  • @Box9 Keine Sorge, ich bin sowieso Repräsentantin: P

    – Alex

    8. Juni 2011 um 23:45 Uhr

  • @alex bin ich jetzt auch 😮 (noch 10 minuten!)

    – David Tang

    8. Juni 2011 um 23:49 Uhr


  • @RobG Rep Capped ist, wenn Sie die maximale Wiederholung für einen Zeitraum von 24 Stunden erreicht haben. Danach zählen Upvotes nicht zu Ihrer Reputation.

    – Alex

    8. Juni 2011 um 23:53 Uhr

  • Ist es nicht möglich zu überprüfen, ob eine Variable ein String ist, indem man einfach auf das Vorhandensein eines Members testet, das nur Strings haben? Zum Beispiel: if(myVar.toUpperCase) alert('I am a string');? Sehen: jsfiddle.net/tb3t4nsx

    – Zutat_15939

    31. März 2015 um 15:39 Uhr


  • @ingredient_15939 es ist nicht wirklich ein guter Weg … wegen { toUpperCase: '' }

    – Alex

    2. April 2015 um 0:20 Uhr

Die Kombination der vorherigen Antworten bietet diese Lösungen:

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

oder

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

Der folgende Ausdruck wird zurückgegeben Stimmt:

'qwe'.constructor === String

Der folgende Ausdruck wird zurückgegeben Stimmt:

typeof 'qwe' === 'string'

Der folgende Ausdruck wird zurückgegeben FALSCH (sic!):

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

Der folgende Ausdruck wird zurückgegeben Stimmt:

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

Der beste und richtige Weg (meiner bescheidenen Meinung nach):

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;
}

  • es gibt keine Funktionsform von typeof, steuern Sie mit diesen Klammern nur die Reihenfolge der Vorgänge. Einige Leute finden es unter bestimmten Umständen möglicherweise lesbarer.

    – Jon z

    19. Oktober 2016 um 21:33 Uhr

  • @Jonz Was meinst du mit “Steuerung der Betriebsreihenfolge”? Vielen Dank.

    – a20

    14. April 2018 um 5:16 Uhr

  • Ich denke, später wurde mir klar, dass Sie den Konstruktor überprüfen und ihn bevorzugen können, da ich theoretisch dachte, er wäre schneller, aber er ist nicht schneller? Beispiel Nummer 4 hier zeigt die Verwendung der 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 zur ‘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

    15. April 2018 um 13:08 Uhr


  • @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 (Operatorgruppierung) haben die höchste Operatorpriorität und werden daher zuerst ausgewertet. In diesem Fall sind die Klammern um filename Gruppieren Sie nur eine einzelne Anweisung und sind daher nutzlos und belanglos. 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

    5. Juni 2018 um 17:08 Uhr


  • Sehr informativ danke für den Link. Die Klammern werden also zuerst überprüft und ausgeführt? das sollte also sofort laufen, ohne als nächstes nach anderen Aufrufmöglichkeiten zu suchen, alias ohne Klammern, was Schritte später und langsamer wäre? nein? Was verstehe ich dort über den Runtime-Compiler nicht?

    – Meister James

    7. Juni 2018 um 12:55 Uhr

Benutzer-Avatar
Kurkula

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.
}

  • es gibt keine Funktionsform von typeof, steuern Sie mit diesen Klammern nur die Reihenfolge der Vorgänge. Einige Leute finden es unter bestimmten Umständen möglicherweise lesbarer.

    – Jon z

    19. Oktober 2016 um 21:33 Uhr

  • @Jonz Was meinst du mit “Steuerung der Betriebsreihenfolge”? Vielen Dank.

    – a20

    14. April 2018 um 5:16 Uhr

  • Ich denke, später wurde mir klar, dass Sie den Konstruktor überprüfen und ihn bevorzugen können, da ich theoretisch dachte, er wäre schneller, aber er ist nicht schneller? Beispiel Nummer 4 hier zeigt die Verwendung der 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 zur ‘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

    15. April 2018 um 13:08 Uhr


  • @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 (Operatorgruppierung) haben die höchste Operatorpriorität und werden daher zuerst ausgewertet. In diesem Fall sind die Klammern um filename Gruppieren Sie nur eine einzelne Anweisung und sind daher nutzlos und belanglos. 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

    5. Juni 2018 um 17:08 Uhr


  • Sehr informativ danke für den Link. Die Klammern werden also zuerst überprüft und ausgeführt? das sollte also sofort laufen, ohne als nächstes nach anderen Aufrufmöglichkeiten zu suchen, alias ohne Klammern, was Schritte später und langsamer wäre? nein? Was verstehe ich dort über den Runtime-Compiler nicht?

    – Meister James

    7. Juni 2018 um 12:55 Uhr

Benutzer-Avatar
zutat_15939

Mein persönlicher Ansatz, der für alle Fälle zu funktionieren scheint, besteht darin, die Anwesenheit von Mitgliedern zu testen, die alle nur für Saiten vorhanden 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 Fehler hat, aber sie hat mir jahrelang gute Dienste geleistet.

  • Dies wird leicht von jedem alten Objekt getäuscht, das diese Methoden hat.

    – Alex

    1. Juli 2015 um 1:50 Uhr

  • Das nennt man Duck-Typing – zB wenn es wie eine Schnur läuft und wie eine Schnur spricht, könnte es genauso gut eine Schnur sein. Sie sind etwas verrückt, wenn Sie denken, dass dies der beste Weg ist, eine Zeichenfolge zu testen, aber Javascript ist ein Thunderdome, Sie tun es.

    – Jon z

    19. Oktober 2016 um 21:35 Uhr

1298910cookie-checkWie kann ich überprüfen, ob eine Variable in JavaScript eine Zeichenfolge ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy