typeof
Базовый уровень Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Оператор typeof возвращает строку, указывающую тип значения операнда.
Попробуйте
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"
Синтаксис
typeof operand
Параметры
-
operand - Выражение, представляющее объект или примитив, тип которого должен быть возвращен.
Описание
В следующей таблице приведено краткое описание возможных возвращаемых значений typeof. Для получения дополнительной информации о типах и примитивах см. также страницу Структуры данных JavaScript.
| Тип | Результат |
|---|---|
| Undefined | "undefined" |
| Null |
"object" (причина) |
| Boolean | "boolean" |
| Number | "number" |
| BigInt | "bigint" |
| String | "string" |
| Symbol | "symbol" |
| Function (реализует [[Call]] в терминах ECMA-262; классы также являются функциями) | "function" |
| Любой другой объект | "object" |
Этот список значений является исчерпывающим. Не сообщалось о том, что совместимые со спецификацией движки производят (или исторически производили) значения, отличные от перечисленных.
Примеры
Базовое использование
// 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";
В первой реализации JavaScript значения JavaScript были представлены в виде тега типа и значения. Тег типа для объектов был 0. null был представлен как NULL-указатель (0x00 на большинстве платформ). Следовательно, null имел 0 в качестве тега типа, отсюда и возвращаемое значение typeof "object". (ссылка)
Было предложено исправление для ECMAScript (через явное включение), но оно было отклонено. В результате получилось бы typeof null === "null".
Использование оператора new
Все функции-конструкторы, вызываемые с помощью new, вернут непримитивные значения ("object" или "function"). Большинство возвращают объекты, за исключением Function, которая возвращает функцию.
const str = new String("String");
const num = new Number(100);
typeof str; // "object"
typeof num; // "object"
const func = new Function();
typeof func; // "function"
Необходимость скобок в синтаксисе
Оператор typeof имеет более высокий приоритет, чем бинарные операторы, такие как сложение (+). Поэтому скобки необходимы для оценки типа результата сложения.
// Parentheses can be used for determining the data type of expressions. const someData = 99; typeof someData + " foo"; // "number foo" typeof (someData + " foo"); // "string"
Взаимодействие с необъявленными и неинициализированными переменными
typeof работает с необъявленными идентификаторами, возвращая "undefined" вместо генерации ошибки.
typeof undeclaredVariable; // "undefined"
Однако использование typeof с лексическими объявлениями (let const, using await using, и class) в том же блоке до места объявления вызовет ReferenceError. Переменные с областью видимости блока находятся во временной мертвой зоне с начала блока до момента обработки инициализации, в течение которого при обращении к ним будет генерироваться ошибка.
typeof newLetVariable; // ReferenceError
typeof newConstVariable; // ReferenceError
typeof newClass; // ReferenceError
let newLetVariable;
const newConstVariable = "hello";
class newClass {}
Смотрите оператор typeof и undefined для получения более подробной информации.
Исключительное поведение document.all
Все современные браузеры предоставляют нестандартный хост-объект document.all с типом undefined.
typeof document.all === "undefined";
Хотя document.all также является ложным (falsy) и нестрого равно undefined, оно не является undefined. Случай, когда document.all имеет тип "undefined", классифицируется в веб-стандартах как «преднамеренное нарушение» оригинального стандарта ECMAScript в целях веб-совместимости.
Пользовательский метод, который возвращает более специфичный тип
typeof очень полезен, но не так универсален, как может потребоваться. Например, typeof [] — это "object", а также typeof new Date(), typeof /abc/ и т.д.
Для большей специфичности при проверке типов мы представляем здесь пользовательскую функцию type(value), которая в основном имитирует поведение typeof, но для непримитивных значений (т.е. объектов и функций) она возвращает более детализированное имя типа, где это возможно.
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;
}
Для проверки потенциально несуществующих переменных, которые в противном случае вызвали бы ReferenceError, используйте typeof nonExistentVar === "undefined", поскольку это поведение нельзя имитировать с помощью пользовательского кода.
Спецификации
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
typeof |
1 |
12 |
1 |
3 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
Смотрите также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof