typeof возвращает строку с типом значения.
Это встроенный оператор JavaScript, который часто используют для быстрых проверок типа.
Важно: typeof - это именно оператор, а не функция, хотя внешне запись иногда похожа на вызов функции.
Синтаксис
typeof value
typeof(value)
Обе записи работают.
Чаще используют вариант без скобок:
console.log(typeof "hello"); // "string"
Что делает typeof
typeof принимает значение и возвращает строку с названием типа.
console.log(typeof "JavaScript"); // "string"
console.log(typeof 42); // "number"
console.log(typeof true); // "boolean"
Результат всегда имеет тип string.
const result = typeof 10n;
console.log(result); // "bigint"
console.log(typeof result); // "string"
Основные результаты typeof
Вот самые частые значения, которые возвращает оператор:
console.log(typeof "text"); // "string"
console.log(typeof 123); // "number"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof 10n); // "bigint"
console.log(typeof Symbol("id")); // "symbol"
Для обычной базовой проверки этого часто достаточно.
typeof и null
Это самый известный нюанс оператора.
console.log(typeof null); // "object"
Хотя null не является обычным объектом, typeof null возвращает "object". Это историческая особенность JavaScript.
Если нужно проверить именно null, обычно сравнивают напрямую:
if (value === null) {
console.log("Это null");
}
typeof и массивы
С массивами есть похожий нюанс:
console.log(typeof []); // "object"
Массив - это отдельный вид структуры данных, но typeof всё равно вернёт "object".
Поэтому для массива обычно используют не typeof, а Array.isArray():
console.log(Array.isArray([])); // true
console.log(Array.isArray({})); // false
typeof и функции
Для функций typeof возвращает "function".
function greet() {}
console.log(typeof greet); // "function"
console.log(typeof (() => {})); // "function"
Даже класс даёт такой же результат, потому что класс в JavaScript тоже является специальным видом функции.
class User {}
console.log(typeof User); // "function"
typeof и объекты
Для обычных объектов результат будет "object".
console.log(typeof {}); // "object"
console.log(typeof { name: "Anna" }); // "object"
Но это довольно широкая категория. Туда же попадают, например, null и массивы в смысле результата typeof.
Именно поэтому typeof value === "object" не всегда означает “это обычный объект”.
typeof и NaN
Ещё один частый сюрприз:
console.log(typeof NaN); // "number"
NaN действительно имеет тип number, хотя по смыслу означает ошибку числового преобразования.
Если нужно проверить именно NaN, для этого используют Number.isNaN().
const value = Number("hello");
console.log(Number.isNaN(value)); // true
typeof и необъявленная переменная
У typeof есть полезная особенность: он не падает на необъявленной переменной, а возвращает "undefined".
console.log(typeof notDeclaredValue); // "undefined"
Это отличает его от обычного доступа:
// console.log(notDeclaredValue); // ReferenceError
Из-за этого typeof иногда используют для безопасной проверки существования глобальных значений.
Когда typeof действительно полезен
typeof особенно удобен, когда нужно проверить примитивные типы:
- строку
- число
- boolean
- undefined
- bigint
- symbol
- функцию
Пример:
function printUpperCase(value) {
if (typeof value !== "string") {
console.log("Ожидалась строка");
return;
}
console.log(value.toUpperCase());
}
Такие проверки встречаются очень часто и читаются хорошо.
Когда typeof недостаточно
typeof не всегда даёт достаточно точный ответ.
Например:
console.log(typeof null); // "object"
console.log(typeof []); // "object"
console.log(typeof {}); // "object"
Во всех трёх случаях результат похожий, хотя значения разные.
Поэтому обычно:
- для
nullиспользуютvalue === null - для массива используют
Array.isArray(value) - для точной проверки объекта добавляют дополнительные условия
Пример:
if (value !== null && typeof value === "object" && !Array.isArray(value)) {
console.log("Это обычный объект");
}
Осторожно с приоритетом операторов
Есть ещё одна неочевидная ловушка:
console.log(typeof 1 + 2); // "number2"
Так происходит потому, что сначала выполняется typeof 1, получается строка "number", а потом идёт конкатенация с 2.
Если нужен тип результата выражения, лучше писать со скобками:
console.log(typeof (1 + 2)); // "number"
Частые ошибки
Думать, что typeof null вернёт “null”
console.log(typeof null); // "object"
Для null нужна отдельная проверка.
Проверять массив через typeof
console.log(typeof []); // "object"
Для массива почти всегда лучше Array.isArray().
Считать, что typeof object отличает обычный объект от всего остального
console.log(typeof null); // "object"
console.log(typeof []); // "object"
console.log(typeof {}); // "object"
Этой проверки недостаточно, если нужна точность.
Удивляться, что typeof NaN даёт “number”
console.log(typeof NaN); // "number"
Это нормальное поведение JavaScript.
Забывать про скобки в выражениях
console.log(typeof 1 + 2); // "number2"
console.log(typeof (1 + 2)); // "number"
Если проверяется результат выражения, скобки часто обязательны.
Быстрая памятка
typeofвозвращает строку с типом значенияtypeof nullдаёт"object"из-за исторической особенностиtypeof []тоже даёт"object"typeof function() {}даёт"function"typeof NaNдаёт"number"typeof notDeclaredValueбезопасно вернёт"undefined"- для массива обычно лучше
Array.isArray(), а дляnull-=== null
Коротко
typeof - это стандартный оператор JavaScript для быстрой проверки типа. Главное, что стоит запомнить: он отлично подходит для примитивов и функций, но для null, массивов и некоторых более точных сценариев его уже недостаточно, поэтому рядом часто используют === null, Array.isArray() и другие проверки.