Оператор typeof в JavaScript: что он показывает

Что показывает оператор typeof в JavaScript?

Теория: что именно делает typeof

Оператор typeof в JavaScript вычисляет выражение и возвращает строку, описывающую категорию типа получившегося значения. Возвращаемый результат всегда имеет тип string, даже если проверяется число, объект или функция.

В JavaScript тип относится к значению, а не к “переменной как коробке”. Поэтому проверка через typeof отвечает на вопрос: “какой тип у значения прямо сейчас”, а не “как было объявлено имя”.

typeof является оператором языка. Запись typeof x считается обычной формой, а typeof(x) работает как применение скобок к выражению.

Какие строки возвращает typeof

У typeof небольшой фиксированный набор строк. На практике чаще всего встречаются "undefined", "boolean", "number", "string", "object", "function". Также используются "symbol" и "bigint".

Примеры:

typeof undefined; // "undefined"
typeof true; // "boolean"
typeof 42; // "number"
typeof 3.14; // "number"
typeof NaN; // "number"
typeof "text"; // "string"
typeof Symbol("id"); // "symbol"
typeof 10n; // "bigint"
typeof {}; // "object"
typeof function(){}; // "function"

Следует учитывать, что typeof почти не “детализирует” объектные значения. Для большинства объектов (включая массивы и даты) возвращается "object".

Таблица: значения и результат typeof

ЗначениеПримерРезультат typeof
Undefinedundefined"undefined"
Nullnull"object"
Booleanfalse"boolean"
Number0, NaN, Infinity"number"
String"a""string"
BigInt1n"bigint"
SymbolSymbol()"symbol"
Function() => {}"function"
Object{}"object"
Array[]"object"
Datenew Date()"object"
typeof null возвращает "object". Это известная историческая особенность JavaScript, поэтому null следует проверять отдельно сравнением value === null.

Типичные ловушки и корректные проверки

Почему массив — это "object"

Массив в JavaScript является объектом со специальным поведением (числовые индексы, свойство length, методы). Поэтому typeof [] возвращает "object", а не отдельный тип "array".

Примеры:

typeof []; // "object"Array.isArray([]); // trueArray.isArray({}); // false

Для распознавания массива обычно применяется Array.isArray(value), а typeof используется как базовая классификация.

Почему null дает "object"

Значение null обозначает “нет объектного значения”. Однако из-за старого решения в реализации языка typeof null возвращает "object", и это поведение сохранено ради совместимости.

Практическое следствие: проверка “объект ли это” через typeof value === "object" должна учитывать null, иначе null будет ошибочно принят за объект.

Пример логики проверок:

function isObjectLike(value) {
  if (value === null) return false;
  return typeof value === "object";
}

isObjectLike(null); // false
isObjectLike({}); // true
isObjectLike([]); // true

Почему функция — это "function"

Функции в JavaScript являются объектами (у них есть свойства, прототипные связи), но оператор typeof возвращает для них отдельную строку "function". Это позволяет удобно проверять “можно ли вызвать”.

Примеры:

typeof (() => {}); // "function"typeof Math.max; // "function"

Проверка необъявленного идентификатора

Особенность typeof состоит в том, что проверка необъявленного идентификатора не приводит к ошибке ReferenceError, а возвращает "undefined". Это отличается от прямого чтения такого имени.

Примеры:

typeof notDeclared; // "undefined"

Если попытаться выполнить выражение notDeclared;, возникнет ReferenceError.

Проверка typeof x === "undefined" означает только то, что результат чтения выражения равен undefined. Переменная может быть объявлена и намеренно содержать undefined.

Как мысленно представить работу typeof

Удобная модель: сначала вычисляется выражение, затем готовое значение относится к одной из “корзин” типов, после чего возвращается строковая метка.

Схема:

[выражение]
↓ вычисление
[значение]
↓ классификация typeof
"undefined" | "boolean" | "number" | "string" | "bigint" | "symbol" | "function" | "object"

Важно, что “object” в этой модели является широкой категорией, в которую попадает много разных структур данных.

Практические примеры (простые и полезные)

Пример: различение null, массива и прочих типов.

function describe(value) {
  if (value === null) return "null";
  if (Array.isArray(value)) return "array";
  return typeof value;
}

describe(null); // "null"
describe([]); // "array"
describe({}); // "object"
describe(10n); // "bigint"
describe(() => {}); // "function"

Пример: грубая проверка “примитив ли это” (без null, так как null не является примитивом в смысле поведения объектов, но и не ведет себя как объект в реальной работе).

function isPrimitive(value) {
  if (value === null) return false;
  const t = typeof value;
  return (
    t === "undefined" ||
    t === "boolean" ||
    t === "number" ||
    t === "string" ||
    t === "symbol" ||
    t === "bigint"
  );
}

isPrimitive(1); // true
isPrimitive("x"); // true
isPrimitive(undefined); // true
isPrimitive(null); // false
isPrimitive({}); // false
isPrimitive([]); // false

Кратко: typeof показывает тип вычисленного значения и возвращает строку из ограниченного набора; null и массивы дают "object", функции дают "function", а проверка необъявленного имени через typeof возвращает "undefined" без ошибки.