Что такое isNaN?nodejs-191

Функция isNaN (Is Not a Number) — это встроенная функция JavaScript, которая проверяет, является ли переданное значение "не числом" (NaN). Однако её поведение часто вызывает путаницу из-за особенностей приведения типов.

Как работает isNaN?

  1. Базовая логика:

    • Возвращает true, если значение равно NaN
    • Возвращает false для любых корректных чисел

    Примеры:

    isNaN(NaN);        // true
    isNaN(123);        // false
    isNaN('123');      // false (строка преобразуется в число)
    isNaN('Hello');    // true (не может быть преобразовано в число)
    
  2. Неочевидное поведение: Функция сначала пытается преобразовать значение к числу:

    isNaN(undefined);  // true
    isNaN(null);       // false (null преобразуется в 0)
    isNaN('');         // false (пустая строка преобразуется в 0)
    isNaN(true);       // false (true → 1)
    

Проблемы isNaN и Number.isNaN

Главная проблема оригинальной isNaN — агрессивное приведение типов. Поэтому в ES6 появилась улучшенная версия:

Number.isNaN('Hello');  // false (строго проверяет NaN)
Number.isNaN(NaN);      // true

Различия: | Значение | isNaN() | Number.isNaN() | |----------------|---------|----------------| | NaN | true | true | | "Hello" | true | false | | undefined | true | false | | {} | true | false | | "123" | false | false |

Когда использовать каждую версию?

  1. Оригинальная isNaN:

    • Когда нужно проверить, "не является ли значение числом" (с приведением типов)
    • Для совместимости с legacy-кодом
  2. Number.isNaN:

    • Когда нужно строго проверить именно значение NaN
    • В современном коде (рекомендуется)

Практические примеры

1. Валидация числового ввода:

function validateInput(value) {
  if (Number.isNaN(Number(value))) {
    console.log('Введите корректное число');
  }
}

2. Фильтрация массива:

const data = [1, 2, '3', NaN, 'text'];
const numbers = data.filter(item => !isNaN(item));
// [1, 2, '3', 'text'] (NaN отфильтрован)

3. Полифилл для Number.isNaN:

if (!Number.isNaN) {
  Number.isNaN = function(value) {
    return typeof value === 'number' && isNaN(value);
  };
}

Альтернативные проверки

Для проверки "числовости" значения часто лучше использовать:

function isNumeric(value) {
  return !isNaN(parseFloat(value)) && isFinite(value);
}

Резюмируем:


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