Prüfen, ob eine Variable in JavaScript eine Zeichenkette ist

Wie kann ich feststellen, ob eine Variable in JavaScript eine Zeichenkette oder etwas anderes ist?

Das ist es, was bei mir funktioniert:

if (typeof myVar === 'string' || myVar instanceof String)
// it's a string
else
// it's something else
Kommentare (34)
Lösung

Sie können den Operator typeof verwenden:

var booleanValue = true; 
var numericalValue = 354;
var stringValue = "This is a String";
var stringObject = new String( "This is a String Object" );
alert(typeof booleanValue) // displays "boolean"
alert(typeof numericalValue) // displays "number"
alert(typeof stringValue) // displays "string"
alert(typeof stringObject) // displays "object"

Beispiel von dieser Webseite. (Das Beispiel wurde allerdings leicht verändert).

Dies funktioniert nicht wie erwartet im Fall von Strings, die mit new String() erstellt wurden, aber dies wird selten verwendet und ist nicht zu empfehlen. Wie Sie damit umgehen können, erfahren Sie in den anderen Antworten, falls Sie dies wünschen.


  1. Der Google JavaScript Style Guide [sagt, niemals primitive Objekt-Wrapper zu verwenden] (https://google.github.io/styleguide/jsguide.html#disallowed-features-wrapper-objects).
  2. Douglas Crockford empfiehlt, dass primitive Objekt-Wrapper veraltet sind.
Kommentare (11)

Der beste Weg:

var s = 'String';
var a = [1,2,3];
var o = {key: 'val'};

(s.constructor === String) && console.log('its a string');
(a.constructor === Array) && console.log('its an array');
(o.constructor === Object) && console.log('its an object');
(o.constructor === Number || s.constructor === Boolean) && console.log('this won\'t run');

Jedes dieser Objekte wurde mit der entsprechenden Klassenfunktion konstruiert, wie "new Object()" usw.

Außerdem: Duck-Typing: "Wenn es wie eine Ente aussieht, wie eine Ente läuft und wie eine Ente riecht - muss es ein Array sein" Das heißt, überprüfen Sie seine Eigenschaften.

Hoffentlich hilft das.

Edit; 12/05/2016

Denken Sie daran, dass Sie immer auch Kombinationen von Ansätzen verwenden können. Hier ist ein Beispiel für die Verwendung einer inline map von Aktionen mit typeof:

var type = { 'number': Math.sqrt.bind(Math), ... }[ typeof datum ];

Hier's ein mehr 'real world' Beispiel für die Verwendung von inline-maps:

function is(datum) {
    var isnt = !{ null: true, undefined: true, '': true, false: false, 0: false }[ datum ];
    return !isnt;
}
console.log( is(0), is(false), is(undefined), ... );  // >> true true false

Diese Funktion würde [ custom ] "type-casting" -- eher "type-/-value-mapping" -- verwenden, um herauszufinden, ob eine Variable tatsächlich "existiert". Jetzt können Sie das unangenehme Haar zwischen null & 0 spalten!

In vielen Fällen ist der Typ egal. Eine weitere Möglichkeit, die Typisierung zu umgehen, ist die Kombination von Duck-Type-Sets:

this.id = "998";  // use a number or a string-equivalent
function get(id) {
    if (!id || !id.toString) return;
    if (id.toString() === this.id.toString()) http( id || +this.id );
    // if (+id === +this.id) ...;
}

Sowohl Number.prototype als auch String.prototype haben eine .toString() Methode. Du hast nur sichergestellt, dass das String-Äquivalent der Zahl gleich ist, und dann hast du sichergestellt, dass du es als Number an die http-Funktion übergeben hast. Mit anderen Worten, wir haben uns nicht einmal darum gekümmert, was der Typ ist.

Ich hoffe, das gibt Ihnen mehr Stoff zum Arbeiten :)

Kommentare (5)