← Назад к вопросам

Зачем нужен typeof?

2.0 Middle🔥 171 комментариев
#JavaScript Core#TypeScript

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Зачем нужен typeof?

typeof — это унарный оператор JavaScript, который определяет тип значения переменной. Он возвращает строку, описывающую тип, и является одним из самых важных инструментов для проверки типов во время выполнения программы.

Основные типы, возвращаемые typeof

// Примитивные типы
typeof 42;              // "number"
typeof "hello";         // "string"
typeof true;            // "boolean"
typeof undefined;       // "undefined"
typeof Symbol("id");    // "symbol"
typeof 10n;             // "bigint"

// Объекты и функции
typeof {};              // "object"
typeof [];              // "object" (массив — это тоже объект)
typeof null;            // "object" (историческая ошибка JavaScript)
typeof function() {};   // "function"

Практическое применение

1. Валидация входных данных

function processData(value) {
  if (typeof value !== "number") {
    throw new Error("Ожидается число");
  }
  return value * 2;
}

try {
  console.log(processData(5));     // 10
  console.log(processData("10"));  // Ошибка: Ожидается число
} catch (error) {
  console.error(error.message);
}

2. Проверка существования переменной

// Безопасная проверка без ошибок
if (typeof someGlobalVariable !== "undefined") {
  console.log("Переменная существует");
}

// Альтернатива (опасна, если переменной вообще нет)
if (someGlobalVariable) { }  // ReferenceError

3. Определение типа перед использованием

function calculate(a, b, operation) {
  if (typeof operation !== "function") {
    console.warn("operation должна быть функцией");
    return a + b;  // Операция по умолчанию
  }
  return operation(a, b);
}

console.log(calculate(5, 3, (x, y) => x * y));  // 15
console.log(calculate(5, 3, "invalid"));        // Предупреждение, результат: 8

Особенности и граничные случаи

Проблема с null

typeof null;  // "object" (баг в JavaScript, сохранён для совместимости)

// Правильная проверка на null
if (value === null) {
  console.log("Значение равно null");
} else if (typeof value === "object") {
  console.log("Это объект");
}

Проблема с массивами

typeof [];  // "object"

// Правильная проверка на массив
Array.isArray([]);              // true
Array.isArray({});              // false

const isArray = (val) => typeof val === "object" && Array.isArray(val);

Функции как объекты первого класса

const myFunc = () => {};
const myMethod = function() {};
const MyClass = class {};

typeof myFunc;      // "function"
typeof myMethod;    // "function"
typeof MyClass;     // "function" (классы — это функции)

// Все функции — это объекты
console.log(myFunc.name);      // "myFunc"
console.log(myFunc.length);    // количество параметров

Защита от ошибок в TypeScript

// TypeScript заменяет runtime проверки на compile time
function greet(name: string): string {
  return `Hello, ${name}`;
}

// Это вызовет ошибку компиляции
// greet(123);  // Ошибка: Argument of type number is not assignable to parameter of type string

// Но в runtime всё ещё можно использовать typeof
function safeGreet(name: unknown): string {
  if (typeof name !== "string") {
    throw new Error("Expected string");
  }
  return `Hello, ${name}`;
}

Альтернативы typeof для проверки типов

// instanceof — для проверки прототипа
const date = new Date();
date instanceof Date;     // true
date instanceof Object;   // true

// Object.prototype.toString — более надёжный способ
Object.prototype.toString.call([]);       // "[object Array]"
Object.prototype.toString.call(new Map()); // "[object Map]"
Object.prototype.toString.call(null);      // "[object Null]"

// Array.isArray — специализированная проверка
Array.isArray([1, 2, 3]);  // true

Лучшие практики

1. Всегда проверяй типы перед использованием в критичном коде

function divide(a, b) {
  if (typeof a !== "number" || typeof b !== "number") {
    throw new TypeError("Оба аргумента должны быть числами");
  }
  if (b === 0) {
    throw new Error("Деление на ноль");
  }
  return a / b;
}

2. Используй TypeScript для статической типизации

function divide(a: number, b: number): number {
  if (b === 0) throw new Error("Division by zero");
  return a / b;
}

3. Создавай helper функции для типов

const isString = (val) => typeof val === "string";
const isNumber = (val) => typeof val === "number";
const isFunction = (val) => typeof val === "function";
const isObject = (val) => typeof val === "object" && val !== null && !Array.isArray(val);

if (isString(username)) {
  console.log(username.toUpperCase());
}

Заключение

typeof — это фундаментальный оператор для работы с типами в JavaScript. Хотя он имеет свои особенности (null, массивы), он остаётся первой линией защиты для проверки типов во время выполнения. Комбинируя typeof с другими методами проверки типов и используя TypeScript для статической типизации, ты можешь писать безопасный и надежный код.