Оператор 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 |
|---|---|---|
| Undefined | undefined | "undefined" |
| Null | null | "object" |
| Boolean | false | "boolean" |
| Number | 0, NaN, Infinity | "number" |
| String | "a" | "string" |
| BigInt | 1n | "bigint" |
| Symbol | Symbol() | "symbol" |
| Function | () => {} | "function" |
| Object | {} | "object" |
| Array | [] | "object" |
| Date | new 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" без ошибки.