Оператор typeof
определяет тип данных и возвращает строку с названием типа:
typeof 42; // "number"
typeof "hello"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof null; // "object" (особый случай!)
typeof NaN; // "number" (особый случай!)
Важные особенности:
typeof null
возвращает "object"
(историческая ошибка)typeof NaN
возвращает "number"
(NaN технически число)// Как оператор (без скобок)
typeof value;
// Как функция (со скобками)
typeof(value);
// Оба варианта работают одинаково
console.log(typeof 42); // "number"
console.log(typeof(42)); // "number"
Тип данных | Результат typeof | Пример |
---|---|---|
Number | ”number” | typeof 42 |
String | ”string” | typeof "hello" |
Boolean | ”boolean” | typeof true |
Undefined | ”undefined” | typeof undefined |
Symbol | ”symbol” | typeof Symbol() |
BigInt | ”bigint” | typeof 123n |
Function | ”function” | typeof function(){} |
Object | ”object” | typeof {} |
Array | ”object” | typeof [] |
Null | ”object” | typeof null |
// Числа
console.log(typeof 42); // "number"
console.log(typeof 3.14); // "number"
console.log(typeof Infinity); // "number"
console.log(typeof NaN); // "number" ⚠️
// Строки
console.log(typeof "hello"); // "string"
console.log(typeof 'world'); // "string"
console.log(typeof `template`); // "string"
// Логический тип
console.log(typeof true); // "boolean"
console.log(typeof false); // "boolean"
// Undefined
let x;
console.log(typeof x); // "undefined"
console.log(typeof undefined); // "undefined"
// null — историческая ошибка!
console.log(typeof null); // "object" ⚠️
// Функции
function greet() { return "Hi!"; }
console.log(typeof greet); // "function"
// Стрелочные функции
const arrow = () => {};
console.log(typeof arrow); // "function"
// Объекты и массивы
console.log(typeof {}); // "object"
console.log(typeof []); // "object"
console.log(typeof new Date()); // "object"
// Symbol (ES6)
const sym = Symbol('id');
console.log(typeof sym); // "symbol"
// BigInt (ES2020)
const big = 123n;
console.log(typeof big); // "bigint"
Это историческая ошибка в JavaScript, которую нельзя исправить:
console.log(typeof null); // "object" (неправильно!)
console.log(null === null); // true
console.log(typeof null === "object"); // true
// Правильная проверка на null
function isNull(value) {
return value === null;
}
// Или проверка на "пустоту"
function isEmpty(value) {
return value === null || value === undefined;
}
Почему так произошло?
В первой версии JavaScript значения представлялись как тег типа + значение. Объекты имели тег 0, а null
представлялся как NULL-указатель (0x00), поэтому получил тег объекта.
NaN
(Not a Number) технически является числовым типом:
console.log(typeof NaN); // "number"
console.log(NaN === NaN); // false (уникальное свойство!)
// Правильная проверка на NaN
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN("hello")); // false
// Устаревший способ (менее точный)
console.log(isNaN(NaN)); // true
console.log(isNaN("hello")); // true (приводит к числу!)
function safeAdd(a, b) {
if (typeof a === "number" && typeof b === "number") {
return a + b;
}
throw new Error("Аргументы должны быть числами");
}
console.log(safeAdd(5, 3)); // 8
// safeAdd("5", 3); // Error
function processValue(value) {
switch (typeof value) {
case "string":
return value.toUpperCase();
case "number":
return value * 2;
case "boolean":
return !value;
case "undefined":
return "Значение не определено";
default:
return "Неизвестный тип";
}
}
console.log(processValue("hello")); // "HELLO"
console.log(processValue(5)); // 10
console.log(processValue(true)); // false
function createUser(name, age, isActive) {
// Проверяем типы параметров
if (typeof name !== "string") {
throw new Error("Имя должно быть строкой");
}
if (typeof age !== "number" || age < 0) {
throw new Error("Возраст должен быть положительным числом");
}
if (typeof isActive !== "boolean") {
throw new Error("isActive должно быть boolean");
}
return { name, age, isActive };
}
console.log(typeof {}); // "object"
console.log(typeof []); // "object"
console.log(typeof null); // "object"
console.log(typeof new Date()); // "object"
// Более точные проверки
Array.isArray([]); // true
value instanceof Date; // true для дат
Object.prototype.toString.call([]); // "[object Array]"
// Это вызовет ReferenceError
// console.log(undeclaredVar);
// Но typeof работает!
console.log(typeof undeclaredVar); // "undefined"
// Полезно для проверки существования глобальных переменных
if (typeof window !== "undefined") {
// Код для браузера
}
const arr = [];
const date = new Date();
console.log(arr instanceof Array); // true
console.log(date instanceof Date); // true
console.log(arr instanceof Object); // true (массивы — объекты)
function getType(value) {
return Object.prototype.toString.call(value).slice(8, -1);
}
console.log(getType([])); // "Array"
console.log(getType({})); // "Object"
console.log(getType(null)); // "Null"
console.log(getType(new Date())); // "Date"
// Для массивов
Array.isArray([]); // true
// Для чисел
Number.isNaN(NaN); // true
Number.isFinite(42); // true
Number.isInteger(42); // true
// Для строк
value instanceof String; // false для примитивов
typeof value === "string"; // true для примитивов
console.log(typeof typeof 42);
console.log(typeof null);
console.log(typeof undefined);
console.log(typeof NaN);
function test() {}
const arrow = () => {};
const obj = { method() {} };
console.log(typeof test);
console.log(typeof arrow);
console.log(typeof obj.method);
let x;
console.log(typeof x);
console.log(typeof y);
console.log(typeof [1, 2, 3]);
console.log(typeof { length: 3 });
console.log(Array.isArray([1, 2, 3]));
console.log(Array.isArray({ length: 3 }));
const sym1 = Symbol("test");
const sym2 = Symbol("test");
const big = 123n;
console.log(typeof sym1);
console.log(typeof big);
console.log(sym1 === sym2);
// Плохо — не учитывает особенности
if (typeof value === "object") {
// Сработает для null, массивов, дат...
}
// Хорошо — точная проверка
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
// Только для обычных объектов
}
// Отлично для примитивных типов
if (typeof str === "string") { /* ... */ }
if (typeof num === "number" && !Number.isNaN(num)) { /* ... */ }
if (typeof bool === "boolean") { /* ... */ }
function getDetailedType(value) {
const type = typeof value;
if (type === "object") {
if (value === null) return "null";
if (Array.isArray(value)) return "array";
if (value instanceof Date) return "date";
return "object";
}
return type;
}
typeof
возвращает строку с названием типа данныхtypeof null === "object"
, typeof NaN === "number"
Array.isArray()
, instanceof
для точностиОператор typeof
— это базовый инструмент для проверки типов в JavaScript. Знание его особенностей поможет избежать багов и писать более надежный код!
Хочешь больше статей по подготовке к собеседованию? Подпишись на EasyAdvice(@AleksandrEmolov_EasyAdvice), добавляй сайт в избранное и прокачивай себя каждый день 💪