typeof
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Der typeof
Operator gibt einen String zurück, der den Typ des Werts des Operanden angibt.
Probieren Sie es aus
Syntax
typeof operand
Parameter
operand
-
Ein Ausdruck, der das Objekt oder das Primärwert darstellt, dessen Typ zurückgegeben werden soll.
Beschreibung
In der folgenden Tabelle sind die möglichen Rückgabewerte von typeof
zusammengefasst. Weitere Informationen zu Typen und Primärwerten finden Sie auch auf der Seite JavaScript Datenstrukturen.
Typ | Ergebnis |
---|---|
Undefined | "undefined" |
Null | "object" (Begründung) |
Boolean | "boolean" |
Number | "number" |
BigInt | "bigint" |
String | "string" |
Symbol | "symbol" |
Function (implementiert [[Call]] in den ECMA-262-Termini; Klassen sind ebenfalls Funktionen) | "function" |
Jedes andere Objekt | "object" |
Diese Liste der Werte ist umfassend. Es sind keine benutzerkonformen Engines gemeldet worden, die Werte produzieren (oder historisch produziert haben), die von den aufgelisteten abweichen.
Beispiele
Grundlegende Nutzung
// Numbers
typeof 37 === "number";
typeof 3.14 === "number";
typeof 42 === "number";
typeof Math.LN2 === "number";
typeof Infinity === "number";
typeof NaN === "number"; // Despite being "Not-A-Number"
typeof Number("1") === "number"; // Number tries to parse things into numbers
typeof Number("shoe") === "number"; // including values that cannot be type coerced to a number
typeof 42n === "bigint";
// Strings
typeof "" === "string";
typeof "bla" === "string";
typeof `template literal` === "string";
typeof "1" === "string"; // note that a number within a string is still typeof string
typeof typeof 1 === "string"; // typeof always returns a string
typeof String(1) === "string"; // String converts anything into a string, safer than toString
// Booleans
typeof true === "boolean";
typeof false === "boolean";
typeof Boolean(1) === "boolean"; // Boolean() will convert values based on if they're truthy or falsy
typeof !!1 === "boolean"; // two calls of the ! (logical NOT) operator are equivalent to Boolean()
// Symbols
typeof Symbol() === "symbol";
typeof Symbol("foo") === "symbol";
typeof Symbol.iterator === "symbol";
// Undefined
typeof undefined === "undefined";
typeof declaredButUndefinedVariable === "undefined";
typeof undeclaredVariable === "undefined";
// Objects
typeof { a: 1 } === "object";
// use Array.isArray or Object.prototype.toString.call
// to differentiate regular objects from arrays
typeof [1, 2, 4] === "object";
typeof new Date() === "object";
typeof /regex/ === "object";
// The following are confusing, dangerous, and wasteful. Avoid them.
typeof new Boolean(true) === "object";
typeof new Number(1) === "object";
typeof new String("abc") === "object";
// Functions
typeof function () {} === "function";
typeof class C {} === "function";
typeof Math.sin === "function";
typeof null
// This stands since the beginning of JavaScript
typeof null === "object";
In der ersten Implementierung von JavaScript wurden JavaScript-Werte als ein Typ-Tag und ein Wert repräsentiert. Das Typ-Tag für Objekte war 0
. null
wurde als der NULL-Zeiger (0x00
in den meisten Plattformen) dargestellt. Folglich hatte null
das Typ-Tag 0
, daher der typeof
-Rückgabewert "object"
. (Referenz)
Ein Fix wurde für ECMAScript vorgeschlagen (über einen Opt-in), aber wurde abgelehnt. Es hätte zu typeof null === "null"
geführt.
Verwendung des new Operators
Alle Konstruktorfunktionen, die mit new
aufgerufen werden, geben Nicht-Primärwerte zurück ("object"
oder "function"
). Die meisten geben Objekte zurück, mit der bemerkenswerten Ausnahme von Function
, die eine Funktion zurückgibt.
const str = new String("String");
const num = new Number(100);
typeof str; // "object"
typeof num; // "object"
const func = new Function();
typeof func; // "function"
Bedarf an Klammern in der Syntax
Der typeof
-Operator hat eine höhere Priorität als Binäroperatoren wie Addition (+
). Deshalb werden Klammern benötigt, um den Typ eines Additionsergebnisses zu bewerten.
// Parentheses can be used for determining the data type of expressions.
const someData = 99;
typeof someData + " Wisen"; // "number Wisen"
typeof (someData + " Wisen"); // "string"
Interaktion mit nicht deklarierten und uninitialisierten Variablen
typeof
gibt im Allgemeinen immer garantiert einen String für jeden übergebenen Operanden zurück. Selbst bei nicht deklarierten Bezeichnern wird typeof
"undefined"
zurückgeben, anstatt einen Fehler zu werfen.
typeof undeclaredVariable; // "undefined"
Allerdings wird bei der Verwendung von typeof
mit lexikalischen Deklarationen (let
const
, und class
) im selben Block vor der Deklarationsstelle ein ReferenceError
geworfen. Block-skopierte Variablen befinden sich in einer temporal dead zone vom Anfang des Blocks bis zur Verarbeitung der Initialisierung, während der ein Fehler geworfen wird, wenn darauf zugegriffen wird.
typeof newLetVariable; // ReferenceError
typeof newConstVariable; // ReferenceError
typeof newClass; // ReferenceError
let newLetVariable;
const newConstVariable = "hello";
class newClass {}
Außergewöhnliches Verhalten von document.all
Alle aktuellen Browser stellen ein nicht standardmäßiges Hostobjekt document.all
mit dem Typ undefined
bereit.
typeof document.all === "undefined";
Obwohl document.all
auch falsy und lose gleich zu undefined
ist, ist es nicht undefined
. Der Fall, dass document.all
den Typ "undefined"
hat, wird in den Webstandards als "bewusste Verletzung" des ursprünglichen ECMAScript-Standards für die Web-Kompatibilität klassifiziert.
Benutzerdefinierte Methode, die einen spezifischeren Typ erhält
typeof
ist sehr nützlich, aber es ist nicht so vielseitig, wie es erforderlich sein könnte. Zum Beispiel ist typeof []
"object"
, ebenso wie typeof new Date()
, typeof /abc/
, etc.
Für eine größere Spezifizität beim Überprüfen von Typen stellen wir hier eine benutzerdefinierte type(value)
-Funktion vor, die das Verhalten von typeof
größtenteils nachahmt, jedoch für Nicht-Primärwerte (also Objekte und Funktionen) einen spezifischeren Typnamen zurückgibt, wo möglich.
function type(value) {
if (value === null) {
return "null";
}
const baseType = typeof value;
// Primitive types
if (!["object", "function"].includes(baseType)) {
return baseType;
}
// Symbol.toStringTag often specifies the "display name" of the
// object's class. It's used in Object.prototype.toString().
const tag = value[Symbol.toStringTag];
if (typeof tag === "string") {
return tag;
}
// If it's a function whose source code starts with the "class" keyword
if (
baseType === "function" &&
Function.prototype.toString.call(value).startsWith("class")
) {
return "class";
}
// The name of the constructor; for example `Array`, `GeneratorFunction`,
// `Number`, `String`, `Boolean` or `MyCustomClass`
const className = value.constructor.name;
if (typeof className === "string" && className !== "") {
return className;
}
// At this point there's no robust way to get the type of value,
// so we use the base implementation.
return baseType;
}
Um möglicherweise nicht vorhandene Variablen zu überprüfen, die ansonsten einen ReferenceError
auslösen würden, verwenden Sie typeof nonExistentVar === "undefined"
, da dieses Verhalten mit benutzerdefiniertem Code nicht nachgeahmt werden kann.
Spezifikationen
Specification |
---|
ECMAScript Language Specification # sec-typeof-operator |
Browser-Kompatibilität
BCD tables only load in the browser