← Назад к вопросам

Как проверить значение на NaN?

1.2 Junior🔥 81 комментариев
#Node.js и JavaScript

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Проверка значения на NaN в JavaScript/TypeScript

NaN (Not-a-Number) — особое значение в JavaScript, которое представляет математически неопределённый результат. Проверка на NaN требует специального подхода, так как `NaN !== NaN`.

Основные методы проверки

1. Number.isNaN() — правильный способ (рекомендуется)

// ✅ Правильно — проверяет именно NaN
Number.isNaN(NaN);              // true
Number.isNaN(123);              // false
Number.isNaN('text');           // false (не приводит к типам)
Number.isNaN(undefined);        // false

// Используй для строгой проверки
const value = parseFloat('abc');
if (Number.isNaN(value)) {
  console.log('Ошибка парсинга');
}

2. isNaN() — глобальная функция (избегай!)

// ❌ Неправильно — приводит к типам
isNaN(NaN);                 // true
isNaN('text');              // true (опасно!)
isNaN(undefined);           // true
isNaN(null);                // false

// Может привести к неожиданному поведению
if (isNaN(userInput)) {     // true даже если это не число!
  // ...
}

3. Object.is() — альтернативный вариант

// ✅ Также работает для NaN
Object.is(NaN, NaN);        // true
Object.is(0, -0);           // false (отличает +0 и -0)
Object.is(123, 123);        // true

const checkIsNaN = (value) => Object.is(value, NaN);

4. Сравнение с самим собой

// ✅ Трюк: NaN — единственное значение, не равное самому себе
const isNaN = (value) => value !== value;

isNaN(NaN);                 // true
isNaN(123);                 // false

Практические примеры в Node.js

Валидация числовых данных:

function validateNumber(input: any): number {
  const num = Number(input);
  
  if (Number.isNaN(num)) {
    throw new Error(`Invalid number: ${input}`);
  }
  
  return num;
}

validateNumber('42');       // 42
validateNumber('abc');      // Error
validateNumber(null);       // 0 (будь внимателен!)

Обработка результатов вычислений:

function calculateDiscount(price: number, percent: number): number {
  const discount = (price * percent) / 100;
  
  if (Number.isNaN(discount)) {
    throw new Error('Invalid calculation parameters');
  }
  
  return price - discount;
}

// Пример ошибки
const result = Math.sqrt(-1);    // NaN (квадратный корень из отрицательного)
if (Number.isNaN(result)) {
  console.error('Cannot calculate square root of negative number');
}

Парсинг JSON:

function safeParseJSON(json: string): any {
  try {
    const parsed = JSON.parse(json);
    
    // Проверка на NaN в значениях
    if (typeof parsed === 'number' && Number.isNaN(parsed)) {
      throw new Error('JSON contains NaN');
    }
    
    return parsed;
  } catch (error) {
    console.error('Parse error:', error);
    return null;
  }
}

Проверка в TypeScript:

function processValue(value: number): void {
  // TypeScript type guard
  if (Number.isNaN(value)) {
    console.log('Not a number');
    return;
  }
  
  // value гарантированно number (но не NaN)
  const doubled = value * 2;
}

Рекомендации

СпособКогда использоватьПримечание
Number.isNaN()Всегда (стандарт)Не приводит к типам, самый надёжный
Object.is()Когда нужна точностьПравильно различает NaN и ±0
isNaN()Никогда (deprecated)Опасен, приводит строки к числам
СравнениеДля хакаРаботает, но неочевидно

Золотое правило: используй Number.isNaN() для проверки на NaN в Node.js. Это современный стандарт, безопасен и явен в намерениях.

Как проверить значение на NaN? | PrepBro