> Как проверить, что первый аргумент является числом в JavaScript? (JavaScript)

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

Компании: Газпромбанк

Стек: JavaScript

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

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

Проверить, что первый аргумент является числом в JavaScript, можно с помощью typeof arg === 'number' && !Number.isNaN(arg). Это исключает NaN, который typeof определяет как 'number'. Для более строгой проверки (целое число) используют Number.isInteger(arg). Если аргумент может быть объектом-обёрткой Number, добавляют arg instanceof Number.

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

В JavaScript существует несколько способов проверки, является ли значение числом, каждый со своими нюансами:

  • typeof arg === 'number' - базовый способ, но возвращает true для NaN, что часто нежелательно.
  • Number.isFinite(arg) - проверяет, что значение является числом и не равно Infinity, -Infinity или NaN.
  • Number.isInteger(arg) - строгая проверка на целое число (не дробное и не NaN/Infinity).
  • Object.prototype.toString.call(arg) === '[object Number]' - работает и для примитивов, и для объектов-обёрток.

Важно различать примитивный тип number и объект Number. При использовании new Number(5) typeof вернёт 'object', а arg instanceof Number - true. Для большинства практических задач достаточно проверки через typeof с отсеиванием NaN.

На практике

При разработке на фронтенде часто нужно проверять аргументы функций, значения из input-полей или данные из API. Для чисел с плавающей точкой используйте Number.isFinite(), для целых - Number.isInteger(). Если ожидается строка, которую нужно преобразовать, применяйте Number(value) или parseInt/parseFloat с последующей проверкой.

Для полиморфных функций, принимающих и примитивы, и объекты, используйте комбинацию typeof arg === 'number' || arg instanceof Number. В TypeScript эти проверки часто заменяются типами, но в чистом JS они необходимы для надёжности.

Пример кода

JAVASCRIPT
// Базовая проверка с исключением NaN
function isNumber(value) {
return typeof value === 'number' && !Number.isNaN(value);
}
// Проверка на конечное число (не Infinity)
function isFiniteNumber(value) {
return Number.isFinite(value);
}
// Проверка на целое число
function isInteger(value) {
return Number.isInteger(value);
}
// Универсальная проверка (примитив или объект Number)
function isNumberOrWrapper(value) {
return (typeof value === 'number' && !Number.isNaN(value))
|| value instanceof Number;
}
// Примеры использования
console.log(isNumber(42)); // true
console.log(isNumber(NaN)); // false
console.log(isNumber('42')); // false
console.log(isNumber(new Number(5))); // false (объект)
console.log(isNumberOrWrapper(new Number(5))); // true

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

Начните с простого решения через typeof, затем уточните про NaN. Покажите понимание различий между Number.isNaN() и глобальной isNaN(). Упомяните edge cases: Infinity, объекты-обёртки, BigInt. Если спросят про производительность, отметьте, что typeof - самый быстрый способ. Для senior-позиции важно продемонстрировать знание контекста: когда какая проверка уместна, и как избегать ложных срабатываний.

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

  • Понимание системы типов JavaScript и разницы между примитивами и объектами.
  • Знание особенностей NaN и способов его обнаружения.
  • Умение выбирать подходящую проверку под конкретную задачу.
  • Осведомлённость о потенциальных подводных камнях (например, typeof null === 'object').
  • Способность объяснить trade-off между строгостью проверки и производительностью.

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

  • Использование isNaN(value) без понимания, что она приводит аргумент к числу (например, isNaN('строка') вернёт true).
  • Проверка только через typeof value === 'number' без учёта NaN.
  • Путаница между Number.isNaN() и глобальной isNaN().
  • Игнорирование случая с объектом new Number().
  • Использование value == null для проверки на число (это проверяет только на null/undefined).

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

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