Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
typeof
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since Juli 2015.
Dertypeof Operator gibt einen String zurück, der den Typ des Werts des Operanden angibt.
In diesem Artikel
Probieren Sie es aus
console.log(typeof 42);// Expected output: "number"console.log(typeof "blubber");// Expected output: "string"console.log(typeof true);// Expected output: "boolean"console.log(typeof undeclaredVariable);// Expected output: "undefined"Syntax
typeof operandParameter
Beschreibung
Die folgende Tabelle fasst die möglichen Rückgabewerte vontypeof zusammen. Weitere Informationen zu Typen und Primitives finden Sie auch auf der SeiteJavaScript-Datenstrukturen.
| Typ | Ergebnis |
|---|---|
| Undefined | "undefined" |
| Null | "object" (Grund) |
| Boolean | "boolean" |
| Number | "number" |
| BigInt | "bigint" |
| String | "string" |
| Symbol | "symbol" |
| Function (implementiert [[Call]] in ECMA-262-Begriffen;Klassen sind ebenfalls Funktionen) | "function" |
| Jedes andere Objekt | "object" |
Diese Liste von Werten ist vollständig. Es sind keine spezifikationskonformen Engines bekannt, die Werte produzieren (oder historisch produziert haben), die von diesen abweichen.
Beispiele
>Grundlegende Verwendung
// Numberstypeof 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 numberstypeof Number("shoe") === "number"; // including values that cannot be type coerced to a numbertypeof 42n === "bigint";// Stringstypeof "" === "string";typeof "bla" === "string";typeof `template literal` === "string";typeof "1" === "string"; // note that a number within a string is still typeof stringtypeof typeof 1 === "string"; // typeof always returns a stringtypeof String(1) === "string"; // String converts anything into a string, safer than toString// Booleanstypeof true === "boolean";typeof false === "boolean";typeof Boolean(1) === "boolean"; // Boolean() will convert values based on if they're truthy or falsytypeof !!1 === "boolean"; // two calls of the ! (logical NOT) operator are equivalent to Boolean()// Symbolstypeof Symbol() === "symbol";typeof Symbol("foo") === "symbol";typeof Symbol.iterator === "symbol";// Undefinedtypeof undefined === "undefined";typeof declaredButUndefinedVariable === "undefined";typeof undeclaredVariable === "undefined";// Objectstypeof { a: 1 } === "object";// use Array.isArray or Object.prototype.toString.call// to differentiate regular objects from arraystypeof [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";// Functionstypeof function () {} === "function";typeof class C {} === "function";typeof Math.sin === "function";typeof null
// This stands since the beginning of JavaScripttypeof null === "object";In der ersten Implementierung von JavaScript wurden JavaScript-Werte als Typ-Tag und Wert dargestellt. Das Typ-Tag für Objekte war0.null wurde als NULL-Zeiger dargestellt (0x00 auf den meisten Plattformen). Folglich hattenull0 als Typ-Tag, daher dertypeof Rückgabewert"object". (Referenz)
Ein Fix wurde für ECMAScript vorgeschlagen (über ein Opt-in), aberwurde abgelehnt. Es hätte resultiert intypeof null === "null".
Verwenden des new Operators
Alle Konstruktorfunktionen, die mitnew aufgerufen werden, werden nicht-primitives zurückgeben ("object" oder"function"). Die meisten geben Objekte zurück, mit der bemerkenswerten AusnahmeFunction, 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"Notwendigkeit von Klammern in der Syntax
Dertypeof Operator hat höherePriorität als binäre Operatoren wie die Addition (+). Daher sind Klammern erforderlich, um den Typ des Additionsergebnisses zu bewerten.
// Parentheses can be used for determining the data type of expressions.const someData = 99;typeof someData + " foo"; // "number foo"typeof (someData + " foo"); // "string"Interaktion mit nicht deklarierten und nicht initialisierten Variablen
typeof funktioniert mit nicht deklarierten Identifikatoren und gibt"undefined" zurück, anstatt einen Fehler zu werfen.
typeof undeclaredVariable; // "undefined"Jedoch wird der Einsatz vontypeof auf lexikalischen Deklarationen (letconst,usingawait using, undclass) im selben Block vor der Deklaration eineReferenceError auslösen. Blockgebundene Variablen befinden sich in einerzeitlichen Sperrzone vom Beginn des Blocks bis die Initialisierung verarbeitet wird, währenddessen ein Fehler geworfen wird, wenn sie aufgerufen werden.
typeof newLetVariable; // ReferenceErrortypeof newConstVariable; // ReferenceErrortypeof newClass; // ReferenceErrorlet newLetVariable;const newConstVariable = "hello";class newClass {}Siehetypeof Operator undundefined für weitere Details.
Außergewöhnliches Verhalten von document.all
Alle aktuellen Browser stellen ein nicht-standardisiertes Host-Objektdocument.all mit dem Typundefined bereit.
typeof document.all === "undefined";Obwohldocument.all ebenfallsfalsy undlosely equal zuundefined ist, ist es nichtundefined. Der Fall, dassdocument.all den Typ"undefined" hat, wird in den Webstandards als "willkürlicher Bruch" der ursprünglichen ECMAScript-Spezifikation für die Webkompatibilität klassifiziert.
Benutzerdefinierte Methode, die einen spezifischeren Typ erhält
typeof ist sehr nützlich, aber es ist vielleicht nicht so vielseitig wie erforderlich. Zum Beispiel isttypeof []"object", ebenso wietypeof new Date(),typeof /abc/, etc.
Für mehr Spezifität bei der Überprüfung von Typen präsentieren wir hier eine benutzerdefinierte Funktiontype(value), die größtenteils das Verhalten vontypeof nachahmt, aber für nicht-primitives (d.h. Objekte und Funktionen) einen spezifischeren Typennamen 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 potenziell nicht vorhandene Variablen zu überprüfen, die sonst einenReferenceError auslösen würden, verwenden Sietypeof nonExistentVar === "undefined", da dieses Verhalten nicht mit benutzerdefiniertem Code nachgeahmt werden kann.
Spezifikationen
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-typeof-operator> |