typeof / instanceof – type of

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

typeof fragt den Typ eines Operanden ab, instanceof prüft, ob ein Objekt von einem bestimmten Typ ist. 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 Deklaration einer Variablen muss kein Datentyp angegeben werden (darum »schwach«), sondern der Datentyp wird dynamisch im Laufe des Programms zugewiesen.

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, function 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 Vereinbarung 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 type of nicht. Fragen wir nach einem Array mit typeof [a,b,c], kommt object zurück und fragen wir nach einem Objekt tpyeof(myobj), ist die Antwort ebenfalls object. Das ist nicht hilfreich.

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 so schlucken.

Einer der wenigen lichten Momente von type of: Wird eine nicht definierte Variable mit abgefragt, liefert typeof "undefined".

instanceof-Operator

Der instanceof-Operator gibt true zurück, wenn das angegebene Objekt vom angegebenen Typ ist.

objectName instanceof objectType

wobei objectName der Name des Objekts ist, das mit dem objectType verglichen wird und objectType ein Objekttyp wie Date oder Array.

instanceof wird zur Laufzeit benutzt, um den Typ eines Objekts festzustellen.

theDay = new Date(1995, 12, 17)
if (theDay instanceof Date) {
   // Anweisungen
}

let today=new Date()
alert(today instanceof Number) // false, da  today keine Zahl ist.