Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Зачем нужен 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 для статической типизации, ты можешь писать безопасный и надежный код.