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
}
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
}
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
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 String
s (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;
…oder…
var isString = str.constructor == String;
Aber bei einem Multi geht das nicht window
Umgebung (denke iframe
s).
Das kannst du umgehen mit…
var isString = Object.prototype.toString.call(str) == '[object String]';
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";
.
@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
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
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
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