Spec-Zone.ru › JavaScript

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", поскольку это поведение нельзя имитировать с помощью пользовательского кода.

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-typeof-operator

Совместимость с браузерами

Десктопные Мобильные Серверные
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

Смотрите также

  • instanceof
  • document.all преднамеренное нарушение стандарта

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API