Learn JavaScript

isNaN() - глобальная функция для проверки NaN в JavaScript

isNaN() проверяет, станет ли значение NaN после приведения к числу.

Это глобальная функция JavaScript. Она работает не так строго, как Number.isNaN(), потому что сначала пытается преобразовать значение.

Синтаксис

isNaN(value)

value - значение, которое нужно проверить.

Что делает isNaN()

Функция сначала пытается превратить значение в число, а потом проверяет, получился ли NaN.

console.log(isNaN(NaN));     // true
console.log(isNaN("hello")); // true
console.log(isNaN("123"));   // false

Из-за этого isNaN() отвечает не только на вопрос “это NaN?”, но скорее на вопрос “можно ли из этого получить нормальное число?”.

Что возвращает isNaN()

isNaN() всегда возвращает булево значение:

  • true, если после приведения получается NaN
  • false, если значение можно превратить в число
console.log(isNaN("123")); // false
console.log(isNaN("abc")); // true
console.log(isNaN(42));    // false

Неявное приведение типов

Это главный нюанс функции.

isNaN() не проверяет значение “как есть”, а сначала приводит его к числу.

console.log(isNaN("123")); // false
console.log(isNaN(""));    // false
console.log(isNaN(null));  // false

Почему так:

  • "123" превращается в 123
  • "" превращается в 0
  • null превращается в 0

Поэтому результат иногда выглядит неожиданно.

isNaN() и Number.isNaN()

Это самая важная пара для сравнения.

console.log(isNaN("hello"));        // true
console.log(Number.isNaN("hello")); // false
  • isNaN() сначала приводит значение к числу
  • Number.isNaN() ничего не приводит и проверяет только настоящий NaN

Ещё пример:

console.log(isNaN(undefined));        // true
console.log(Number.isNaN(undefined)); // false

Если нужна точная проверка именно на NaN, чаще лучше использовать Number.isNaN().

Когда isNaN() может быть полезен

isNaN() удобен, когда нужно быстро понять, можно ли из значения получить число.

console.log(isNaN("42"));   // false
console.log(isNaN("42px")); // true

То есть функция может пригодиться для грубой проверки пользовательского ввода.

isNaN() и Number()

По сути, isNaN() ведёт себя так, как будто внутри сначала вызывается Number().

console.log(Number("123")); // 123
console.log(isNaN("123"));  // false

А здесь преобразование не удаётся:

console.log(Number("hello")); // NaN
console.log(isNaN("hello"));  // true

Неожиданные примеры

Вот несколько случаев, на которых чаще всего спотыкаются:

console.log(isNaN(""));      // false
console.log(isNaN(" "));     // false
console.log(isNaN(true));    // false
console.log(isNaN([]));      // false
console.log(isNaN([123]));   // false
console.log(isNaN([1, 2]));  // true
console.log(isNaN({}));      // true

Это происходит именно из-за автоматического приведения типов.

После parseInt() и parseFloat()

После числового парсинга обычно удобнее уже не isNaN(), а Number.isNaN().

const value = parseFloat("hello");

console.log(isNaN(value));        // true
console.log(Number.isNaN(value)); // true

Но если число уже получено, более точной и читаемой обычно считается именно проверка через Number.isNaN().

Когда это полезно

isNaN() удобно использовать, когда:

  • нужно быстро проверить, похоже ли значение на число
  • не страшно неявное приведение типов
  • вы осознанно хотите проверять результат преобразования, а не только настоящий NaN

Пример:

if (isNaN(userInput)) {
  console.log("Введите число");
}

Для простой валидации ввода такой вариант иногда встречается.

Частые ошибки

Думать, что isNaN() проверяет только настоящий NaN

console.log(isNaN("hello")); // true

Но строка "hello" сама по себе не равна NaN. Просто после преобразования она становится NaN.

Использовать isNaN() там, где нужна строгая проверка

console.log(isNaN(null));        // false
console.log(Number.isNaN(null)); // false

Здесь проблема в том, что isNaN(null) возвращает false не потому, что null - число, а потому что null превращается в 0.

Удивляться результатам для пустых строк и массивов

console.log(isNaN(""));    // false
console.log(isNaN([]));    // false
console.log(isNaN([123])); // false

Это нормальное поведение для глобальной isNaN(), но именно поэтому она часто кажется “слишком магической”.

Быстрая памятка

  • isNaN() - это глобальная функция
  • она сначала приводит значение к числу
  • возвращает true, если результатом становится NaN
  • из-за приведения типов результат может быть неожиданным
  • для точной проверки настоящего NaN чаще лучше Number.isNaN()

Коротко

isNaN() - это не строгая проверка на NaN, а проверка того, получится ли из значения нормальное число после преобразования. Главное, что стоит запомнить: из-за неявного приведения типов в современном коде её часто используют осторожно, а для точной проверки предпочитают Number.isNaN().