> Когда в JavaScript проверяются типы? (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Purrweb

Стек: JavaScript

> Пример ответа

Короткий ответ

Проверка типов в JavaScript происходит в рантайме, то есть во время выполнения кода, а не на этапе компиляции. Это следствие динамической типизации языка. Однако проверки могут быть явными - через операторы typeof, instanceof, Array.isArray() - или неявными, когда движок сам приводит типы при сравнении или арифметических операциях. Также проверки типов выполняются при вызове методов, если они ожидают определённый тип.

Подробное объяснение

JavaScript - язык с динамической типизацией, поэтому переменные не привязаны к типу, а тип значения проверяется в момент доступа к нему. Это значит, что ошибки типа возникают не при объявлении, а при выполнении операции. Например, вызов несуществующего метода на null или undefined упадёт в рантайме.

Основные механизмы проверки типов:

  • typeof - возвращает строку с типом примитива. Работает корректно для string, number, boolean, symbol, bigint, undefined, function. Для null возвращает "object" - это исторический баг.
  • instanceof - проверяет принадлежность объекта к классу или функции-конструктору через цепочку прототипов. Не работает с примитивами.
  • Array.isArray() - надёжная проверка массивов, так как typeof [] вернёт "object".
  • Object.prototype.toString.call() - универсальный способ получить точный тип, включая "[object Map]", "[object Set]" и т.д.

Неявная проверка типов происходит при использовании операторов сравнения (==, ===), арифметики, шаблонных строк. Движок выполняет приведение типов по правилам спецификации ECMAScript. Например, "5" - 2 даст 3, потому что строка приводится к числу.

Также проверки типов выполняются при вызове встроенных методов: Array.prototype.map ожидает функцию, JSON.parse ожидает строку. Если тип неверный, будет выброшено исключение TypeError.

В современном JavaScript проверки типов часто выносят на уровень разработки с помощью TypeScript или JSDoc-аннотаций, но это уже статическая проверка, которая не влияет на рантайм.

На практике

Для senior-разработчика важно не просто знать операторы, а понимать, когда и где происходят проверки, чтобы избегать скрытых багов. Например, typeof null === "object" - классическая ловушка. Также нужно помнить, что instanceof может давать ложные результаты при работе с несколькими экземплярами одного класса из разных iframe или при изменении прототипа.

Практические рекомендации:

  • Используйте === и !== вместо ==, чтобы избежать неявного приведения типов.
  • Для проверки на null и undefined используйте value == null (сознательно) или value === null || value === undefined.
  • Для проверки на существование свойства используйте in или Object.hasOwn().
  • Для проверки на число используйте Number.isFinite() вместо typeof x === "number" && isFinite(x).
  • Для проверки на пустой объект - Object.keys(obj).length === 0.

В крупных проектах проверки типов в рантайме часто заменяют валидацией данных на границе системы, например, с помощью zod или io-ts. Это позволяет не проверять типы в каждом месте, а доверять данным после валидации.

Пример кода

JAVASCRIPT
// Явные проверки
console.log(typeof "hello"); // "string"
console.log(typeof 42); // "number"
console.log(typeof null); // "object" - баг
console.log(Array.isArray([])); // true
console.log([] instanceof Array); // true
// Точная проверка типа
Object.prototype.toString.call(new Map()); // "[object Map]"
Object.prototype.toString.call(null); // "[object Null]"
// Неявная проверка при приведении
console.log("5" - 2); // 3 - строка приведена к числу
console.log("5" + 2); // "52" - число приведено к строке
// Ошибка в рантайме
const obj = null;
try {
obj.method();
} catch (e) {
console.log(e instanceof TypeError); // true
}
// Проверка на null/undefined
function foo(value) {
if (value == null) {
return "null or undefined";
}
return "value";
}

Как отвечать на собеседовании

Начните с короткого ответа: проверки типов происходят в рантайме, потому что JavaScript динамически типизирован. Затем перечислите основные операторы и их ограничения. Упомяните неявное приведение типов и связанные с ним риски. Если спросят про TypeScript, подчеркните, что это статическая проверка на этапе разработки, а не в рантайме.

Хорошо показать понимание edge cases: typeof null, instanceof с примитивами, разница между == и ===. Можно добавить пример с Object.prototype.toString для точной проверки.

Для senior-позиции стоит упомянуть, что в production-коде проверки типов обычно выносят на границу системы или используют схемы валидации. Это показывает системное мышление.

Что проверяет интервьюер

Интервьюер оценивает:

  • понимание динамической типизации и её последствий;
  • знание операторов typeof, instanceof, Array.isArray и их ограничений;
  • умение объяснить неявное приведение типов;
  • способность избегать типичных ошибок, связанных с проверкой типов;
  • осведомлённость о современных подходах (TypeScript, валидация данных).

Для senior-уровня важно, чтобы кандидат не просто перечислял факты, а показывал, как эти знания применяются в реальных проектах, и мог объяснить, почему некоторые проверки лучше не делать в рантайме.

Типичные ошибки

  • Утверждение, что typeof null возвращает "null" - это неверно, возвращается "object".
  • Использование instanceof для проверки примитивов - всегда false.
  • Полагаться на == без понимания правил приведения - приводит к неожиданным результатам.
  • Проверка на число через typeof x === "number" без учёта NaN и Infinity.
  • Забывать, что typeof function возвращает "function", а не "object".
  • Путать статическую проверку TypeScript с рантайм-проверкой - TypeScript не защищает от ошибок типов во время выполнения.
  • Использовать Array.isArray() для проверки типизированных массивов - для Uint8Array вернёт false.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью