Что такое NaN в JavaScript и как с ним работать?

Ответ

NaN (Not a Number) — это специальное значение в JavaScript, которое представляет результат некорректной или неопределенной математической операции.

Ключевые особенности:

  1. Тип: typeof NaN возвращает "number". Это парадоксально, но NaN является числовым типом.
  2. Сравнение: NaN не равно ничему, включая само себя. NaN === NaN возвращает false.
  3. Распространение: Почти любая математическая операция с NaN в качестве операнда вернет NaN.

Проверка на NaN: Из-за особенности сравнения, для проверки нужно использовать специальные функции:

  • Number.isNaN(value) (рекомендуется) — возвращает true, только если значение в точности равно NaN.
  • Глобальная isNaN(value) — сначала пытается преобразовать значение в число, а затем проверяет. Это может давать неожиданные результаты (isNaN("строка") вернет true).

Примеры в контексте Node.js:

// Как возникает NaN
console.log(0 / 0); // NaN
console.log(Math.sqrt(-1)); // NaN
console.log(parseInt('не число')); // NaN

// Проверка
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN('текст')); // false (в отличие от isNaN)
console.log(isNaN('текст')); // true (потому что 'текст' -> NaN)

// Практический пример: валидация ввода
function parseNumber(input) {
  const num = Number(input);
  if (Number.isNaN(num)) {
    throw new Error('Введено нечисловое значение');
  }
  return num;
}

В Node.js при работе с данными (например, из запросов или файлов) важно использовать Number.isNaN() для точной валидации числовых значений.

Ответ 18+ 🔞

А, ну это про NaN, ёпта! Слушай, сейчас объясню, что это за зверь такой, а то народ часто путается, как будто впервые слышит.

NaN — это, грубо говоря, пиздец в мире чисел. Представь, ты пытаешься поделить ноль на ноль или извлечь корень из минус единицы. Ну и что получится? Правильно, нихуя не получится, а получится вот эта самая хуйня — NaN. Это как бы число, но которое на самом деле не число. Запутал? Сейчас распутаем.

Самое важное, что надо запомнить:

  1. Тип, блядь, парадоксальный. Спросишь у него typeof NaN — он тебе гордо ответит "number". Да-да, ёперный театр, сам от себя охуеешь. Он числового типа, но при этом нихуя не число. Такая вот хитрая жопа.

  2. Он сам себе не ровня. Вот это вообще классика. NaN === NaN возвращает false. Представь, ты приходишь к зеркалу, а отражение тебе говорит: «Пошёл на хуй, я тебя не знаю». Вот это и есть NaN. Он уникальный в своём роде уродец.

  3. Зараза ебаная. Как чума. Коснётся он любой твоей операции — и всё, пиши пропало, результат будет тоже NaN. Заразил всё и вся.

Как проверить, что перед тобой именно этот пидарас шерстяной? Из-за его поехавшей набекрень логики сравнения, if (x === NaN) — это путь в никуда. Надо использовать специальные инструменты:

  • Number.isNaN(value) — это твой бро, твой надёжный друг. Он смотрит на значение и говорит: «Да, это в точности тот самый уродец NaN» или «Нет, это что-то другое». Честный, прямолинейный. Его и используй всегда.
  • Глобальная isNaN(value) — это уже мудя какая-то. Она сначала пытается впендюрить твоё значение в число, а потом уже судит. Скажешь ей isNaN("Привет") — она сначала «Привет» в число превратит (получит NaN), а потом скажет: «Ага, это NaN!». Доверия к ней — ноль ебать. Может наговорить лишнего.

Ну и примерчики, чтобы совсем всё стало ясно, как божий день:

// Откуда эта дрянь берётся
console.log(0 / 0); // NaN (деление на ноль, ёба)
console.log(Math.sqrt(-1)); // NaN (из воздуха корень, бля)
console.log(parseInt('абвгд')); // NaN (ну ты и текст подсунул)

// Проверяем как профи
console.log(Number.isNaN(NaN)); // true (да, это он, гадёныш)
console.log(Number.isNaN('я строка, сука')); // false (а вот это уже нет, isNaN бы соврала!)
console.log(isNaN('я строка, сука')); // true (вот видишь, брехунья!)

// Практика из жизни: допустим, с фронта пришла какая-то хуйня, а тебе число надо
function makeItNumber(input) {
  const num = Number(input);
  if (Number.isNaN(num)) {
    throw new Error('Чувак, ты мне какую-то дичь прислал, это не число!');
  }
  return num;
}

В Node.js, когда данные из запросов ползут или из файлов читаешь, без Number.isNaN() — просто никуда. Иначе потом сиди и лови эти ебушки-воробушки, когда вся логика накроется медным тазом из-за одной вкраплённой заразы.