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

Ответ

В JavaScript NaN (Not-a-Number) — это уникальное значение, представляющее нечисловой результат. Ключевая особенность: NaN не равно ничему, включая само себя (NaN === NaN возвращает false).

Правильные способы проверки:

  1. Number.isNaN(value) (Рекомендуется). Эта функция выполняет строгую проверку: возвращает true только если переданное значение в точности равно NaN.

    console.log(Number.isNaN(NaN));        // true
    console.log(Number.isNaN('text' / 2)); // true (результат операции — NaN)
    console.log(Number.isNaN('text'));     // false (строка — не NaN)
    console.log(Number.isNaN(123));        // false
  2. Object.is(value, NaN). Альтернативный метод, также корректно определяющий NaN.

    console.log(Object.is(NaN, NaN)); // true
  3. Самопроверка (value !== value). Старый трюк, основанный на уникальности NaN. Работает, но менее читаем.

Чего НЕ делать:

  • Не используйте глобальную функцию isNaN(). Она сначала неявно преобразует значение в число, что может дать неожиданные результаты.
    console.log(isNaN('123')); // false (строка преобразуется в число 123)
    console.log(isNaN('text')); // true (строка не преобразуется в число)
    console.log(isNaN(NaN)); // true

    Number.isNaN() лишена этого недостатка.

Ответ 18+ 🔞

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

Смотри, NaN — это такая хитрая жопа в JavaScript. Она означает «не число», но ведёт себя как самый настоящий пидарас шерстяной. Главный прикол в том, что она НЕ РАВНА САМОЙ СЕБЕ. Да-да, ты не ослышался. NaN === NaN возвращает false. Вот такой вот пиздец, Карл. Сам от себя охуел, когда впервые узнал.

Так как же его, блядь, проверить? Есть несколько рабочих способов, а есть один — полная сосалка.

Рабочие методы (делай так)

  1. Number.isNaN(value) — твой лучший друг. Это самый правильный и современный способ. Он не ебёт мозги с преобразованиями, а тупо спрашивает: «Значение — это в точности NaN?». Если да — true, если нет — false. Всё просто, как три копейки.

    console.log(Number.isNaN(NaN));        // true — ну да, это же он
    console.log(Number.isNaN('текст' / 2)); // true — поделил строку на число, получил NaN
    console.log(Number.isNaN('текст'));     // false — это строка, а не NaN, не путай!
    console.log(Number.isNaN(123));        // false — обычное число
  2. Object.is(value, NaN) — солидная альтернатива. Чуть менее популярный, но тоже железобетонный метод. Сработает на ура.

    console.log(Object.is(NaN, NaN)); // true
  3. Старый дедовский трюк: value !== value. Раньше, когда Number.isNaN ещё не изобрели, народ выкручивался так. Логика гениальная в своей простоте: если какая-то хуйня не равна сама себе, то это точно NaN. Работает безотказно, но выглядит как заклинание шамана — читаемость, конечно, ебать колотить.

Чего делать НЕ НАДО (серьёзно, не делай)

Забудь как страшный сон про глобальную функцию isNaN(). Это манда с ушами, которая тебя точно подведёт.

Почему? Да потому что она сначала пытается запихнуть твоё значение в число, а уже потом смотрит, получился ли NaN. Полная пиздопроебибна!

console.log(isNaN('123')); // false
// Опа! Строка '123' спокойно превращается в число 123. NaN? Не-а.
// Но ты-то хотел проверить, является ли ПЕРЕМЕННАЯ значением NaN, а не "можно ли её в число запихнуть".

console.log(isNaN('текст')); // true
// Ну тут да, 'текст' в число не превратить, получаем NaN.

console.log(isNaN(NaN)); // true
// Собственно, единственный случай, когда она работает правильно.

Видишь разницу? Number.isNaN('текст') вернёт false (потому что это строка, а не значение NaN), а старый isNaN('текст') вернёт true. Доверия к такой функции — ноль ебать.

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