Что делает оператор typeof в JavaScript?

Ответ

Оператор typeof возвращает строку, указывающую тип переданного операнда. Это полезно для проверки типа переменной во время выполнения.

Основные возвращаемые значения:

typeof 42;           // "number"
typeof "hello";      // "string"
typeof true;         // "boolean"
typeof undefined;    // "undefined"
typeof null;         // "object" (историческая ошибка)
typeof {};           // "object"
typeof [];           // "object"
typeof function(){}; // "function"
typeof Symbol();     // "symbol"
typeof 42n;          // "bigint"

Ключевые особенности и практическое применение:

  1. Проверка на undefined: typeof variable === "undefined" — безопасный способ, не вызывающий ReferenceError.
  2. Работа с функциями: typeof fn === "function" позволяет проверить, является ли переменная вызываемой функцией.
  3. Ограничения:
    • typeof null возвращает "object" — это известный баг языка, сохраняемый для обратной совместимости. Для точной проверки используйте variable === null.
    • Для различения массивов и объектов typeof недостаточно — применяйте Array.isArray() или instanceof.
    • Все объекты (включая экземпляры классов, даты, регулярные выражения) возвращают "object".

Пример защитного кода:

function safeCall(fn, arg) {
  if (typeof fn !== "function") {
    throw new TypeError("Expected a function");
  }
  return fn(arg);
}

Ответ 18+ 🔞

А, ну вот, опять про этот typeof заговорили! Ну, типа, оператор такой, который тебе, как попугай, повторяет, что за хуйню ты ему в рот суёшь. Строку возвращает, название типа. Полезная штука, когда ты в коде, как слепой котёнок, на ощупь ползаешь и пытаешься понять, с чем имеешь дело.

Ну, смотри, что он обычно бормочет:

typeof 42;           // "number" — ну, цифра, всё ясно.
typeof "hello";      // "string" — строка, не поспоришь.
typeof true;         // "boolean" — булево, да или нет.
typeof undefined;    // "undefined" — нихуя нет, пустота.
typeof null;         // "object" — А ВОТ ТУТ, СУКА, ПИЗДЕЦ! Исторический косяк, который уже не исправить. Просто запомни.
typeof {};           // "object" — ну да, объект.
typeof [];           // "object" — А ЭТО УЖЕ ПРИКОЛ! Массив-то тоже объект, так что `typeof` нихуя не различает. Для этого есть `Array.isArray()`.
typeof function(){}; // "function" — функция, можно вызывать.
typeof Symbol();     // "symbol" — символ, экзотика.
typeof 42n;          // "bigint" — большое целое, для тех, кому мало обычных циферок.

Где это реально пригождается, а где — хуйня полная:

  1. Проверить, есть ли вообще переменная. typeof variable === "undefined" — это святое! Не вызовет ошибку, даже если переменной, блядь, в помине не было. Безопасно, как презерватив.
  2. Убедиться, что тебе функцию подсунули, а не кирпич. typeof fn === "function" — и можно спокойно вызывать fn(), не боясь, что всё ебнется.
  3. А вот где он обманывает, как продавец на рынке:
    • typeof null === "object" — это классика, ёпта! Баг на века. Чтобы точно поймать null, бей в лоб: variable === null.
    • Отличить массив [] от объекта {} он не может, оба — "object". Тут уже Array.isArray(arr) в помощь.
    • Все остальные объекты — даты, регулярки, твои собственные классы — тоже будут "object". Более тонкую проверку делай через instanceof.

Пример, как не сесть в лужу:

function safeCall(fn, arg) {
  // Сначала проверь, не пытаются ли тебя, мудака, наебать, подсунув не функцию.
  if (typeof fn !== "function") {
    throw new TypeError("Expected a function, а ты мне какую-то хуйню подсунул!");
  }
  // Если дошло сюда, значит fn — функция. Можно вызывать.
  return fn(arg);
}

Вот и вся магия. Главное — помни про его приколы с null и массивами, а то будешь потом, как Герасим, «Му-му» говорить, когда код работать не будет.