> Когда в 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([])); // trueconsole.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/undefinedfunction 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.
> Похожие задачи по frontend
Что такое генераторы в JavaScript и для чего они используются
Какие значения являются falsy в JavaScript
Опиши сложный кейс или задачу, с которой ты столкнулся недавно
Расскажите про опыт работы с базами данных и используемые СУБД
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью