Javascript typeof

Javascript Prüfen: typeof oder type of, instanceof oder instance of / Datentyp string or number

typeof fragt den Typ eines Operanden ab. Der Operand kann ein Literal oder eine Variable, eine Funktion oder ein Objekt sein.

Javascript ist eine schwach und gleichzeitig dynamisch typisierte Programmiersprache, denn bei der Definition einer Variablen muss kein Datentyp angegeben werden (darum »schwach«), sondern der Datentyp wird dynamisch im Laufe des Programms zugewiesen.

18-12-15 SITEMAP

Wenn sich der Datentyp ändern kann: typeof

In Javascript wird der Typ einer Variablen nicht ausdrücklich vereinbart und kann jederzeit geändert werden. typeof stellt fest, ob ein Operator vom Typ number oder string, object oder boolean ist.

typeof Undefined"undefined"
typeof Null"object"
typeof Boolean"boolean"
typeof Number"number"
typeof String"string"
typeof Object"object"

Locker typisiert

Programmiersprachen, die bei der Definition einer Variablen den Datentyp erzwingen, gelten als streng typisiert. In Programmiersprachen wie C und Java muss der Typ der Variablen genannt werden. Um eine Variable zum Speichern ganzzahliger Werte oder von Fließkommazahlen zu vereinbaren, muss der Typ ausdrücklich angegeben werden:

int num = 5;  oder   float fnum = 44.5;

Javascript ist eine dynamische oder locker typisierte Sprache:

let x = 5;   oder    let y = "44.5"; 
    ^                          ^
    |                          |
    +-- number                 +-- string

Javascript verlangt keine Typangabe, sondern findet selber heraus, welcher Datentyp in x und y gespeichert wird. Wir dürfen einer Variablen zunächst einen String zuweisen und später einen numerischen Wert. Bei der Ausführung des Programms wird der Javascript-Interpreter die Daten in den korrekten Typ konvertieren. In jeder der folgenden Anweisungen wird Javascript den Typ der Variablen konvertieren:

AnweisungKonvertierung
let item = 5.5;Zuweisung eines Fließkommawerts
item = 44;Konvertierung in einen Integer
item = "Heute scheint die Sonne";Konvertierung in einen String
item = true;Konvertierung in einen Boolean
item = null;Konvertierung in einen null-Wert

Für die Operationen auf Variablen muss das Programm etwas über den Typ der Variablen wissen, sonst könnte das Programm diese Anweisung nicht auflösen:

let x = 100 + "Apple";

Was dabei herauskommt? Javascript würde »100Apple« mit type of als Typ string interpretieren:

let x = "100" + "px";

Das ist zunächst einmal schön bequem. Aber was passiert hier:

let x = 100 + 50 + "px";

Javascript liest die Anweisung von links nach rechts. Das Ergebnis ist der String "150px".

let x = "height:" + 100 + 50 + "px";

Das liefert "height:10050px". Wenn der Datentyp bei einer Operation nicht bekannt ist, hilft typeof.

Der typeof-Operator

typeof gibt einen String zurück, der den Typ des Operanden identifiziert. Der (nicht entwickelte) Operand kann ein String, eine Variable, ein Schlüsselwort oder ein Objekt sein. type of kann z.B. prüfen, ob eine Variable definiert wurde: Wenn kein Wert mit einer Variablen verbunden werden kann, liefert der typeof-Operator immer undefined.

typeof kann auf zweierlei Weise aufgerufen werden:

1. typeof operand
2. typeof (operand)

Die Klammern sind optional.

let fn    = new Function("…")
let height  = 100 + 50; 
let size  = height + "px";
let today = new Date();

Der typeof-Operator gibt bei diesen Beispielen die folgenden Ergebnisse zurück:

typeof fn            function
typeof height        number
typeof size          string
typeof today         object
typeof foo           undefined

Ein Blick in die Browserconsole:

[Log] typeof 123                   = number
[Log] typeof 'abs'                 = string
[Log] typeof document.lastModified = string
[Log] typeof true                  = boolean
[Log] typeof {a:1}                 = object
[Log] typeof (function foo() {})   = function
[Log] typeof Date                  = function
[Log] typeof Math                  = function
[Log] typeof undefined             = undefined
[Log] typeof (Symbol('foo'))       = symbol
[Log] typeof null                  = object
[Log] typeof [1,2,3]               = object
[Log] typeof NaN                   = number

Wo typeof nichts Brauchbares liefert

Glücklich werden wir mit typeof nicht immer. Fragen wir nach einem Array mit typeof [a,b,c], kommt object zurück und fragen wir nach einem Objekt typeof (myobj), ist die Antwort ebenfalls object. Arrays sind nicht anderes als Objekte mit besonderer Ausstattung, aber kein Datentyp. Da kann typeof nicht weiterhelfen.

Um herauszufinden, ob ein Objekt ein Array ist, hat EcmaScript 5 eine Sonderlösung ausgeworfen: Array.isArray(obj). isArray gibt true zurück, wenn das Objekt ein Array ist und ansonsten false.

let month = ["Januar", "Februar", "März", "April"];
console.log ("*** ein Array? " + Array.isArray(month));

Das Fiasko beginnt, wenn der typeof-Operand null ist: typeof(null) antwortet mit object. Das ist einfach falsch, oder? Nun, ECMAScript definiert null als primitiven Wert, der die absichtliche Abwesenheit des Werts eines Objekts wiederspiegelt (ECMA-262, 4.3.12 The typeof Operator null value ). Muss man einfach schlucken.

Ein lichter Moment von type of: Wird eine nicht definierte Variable mit typeof abgefragt, liefert typeof "undefined".

Typecheck mit toString

toString wandelt Javascript-Objekte in Strings [object Object] um und kann als Erweiterung von typeof für eingebaute Objekte wie Array, Date, RegExp, Error … und als Alternative zu instanceof eingesetzt werden.

let today = new Date();
console.log ("today " + today);
console.log ("today.toString() " + today.toString());

let objToString = Object.prototype.toString;
let arr = ["Elefant", "Hase", "Igel"];
console.log (objToString.call(arr));
console.log (objToString.call(today));



typeof oder instanceof

typeof ist die Abfrage für primitive Datentypen, instanceof checkt, ob ein Objekt zu einem bestimmten Objekt oder einer Klasse gehört oder von einem übergeordneten Objekt / Klasse geerbt hat.

agiert aufgibt zurück
typeofprimitiven Datentypenstring
instanceofObjektentrue / false
var today = new Date(); 

if (today instanceof Date) {
	console.log ("Der Typ von today ist Date");
}