Ответ
В JavaScript NaN (Not-a-Number) — это уникальное значение, представляющее нечисловой результат. Ключевая особенность: NaN не равно ничему, включая само себя (NaN === NaN возвращает false).
Правильные способы проверки:
-
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 -
Object.is(value, NaN). Альтернативный метод, также корректно определяющийNaN.console.log(Object.is(NaN, NaN)); // true -
Самопроверка (
value !== value). Старый трюк, основанный на уникальностиNaN. Работает, но менее читаем.
Чего НЕ делать:
- Не используйте глобальную функцию
isNaN(). Она сначала неявно преобразует значение в число, что может дать неожиданные результаты.console.log(isNaN('123')); // false (строка преобразуется в число 123) console.log(isNaN('text')); // true (строка не преобразуется в число) console.log(isNaN(NaN)); // trueNumber.isNaN()лишена этого недостатка.
Ответ 18+ 🔞
Блин, вот сидишь такой, пишешь код, всё вроде летит, а потом бац — и какая-то хрень возвращает NaN. И ты сидишь, чешешь репу: «Ну какого хуя?». А проверяешь его обычным if (x === NaN) — и нихуя не работает. Вот тут-то и начинается веселье, ёпта.
Смотри, NaN — это такая хитрая жопа в JavaScript. Она означает «не число», но ведёт себя как самый настоящий пидарас шерстяной. Главный прикол в том, что она НЕ РАВНА САМОЙ СЕБЕ. Да-да, ты не ослышался. NaN === NaN возвращает false. Вот такой вот пиздец, Карл. Сам от себя охуел, когда впервые узнал.
Так как же его, блядь, проверить? Есть несколько рабочих способов, а есть один — полная сосалка.
✅ Рабочие методы (делай так)
-
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 — обычное число -
Object.is(value, NaN)— солидная альтернатива. Чуть менее популярный, но тоже железобетонный метод. Сработает на ура.console.log(Object.is(NaN, NaN)); // true -
Старый дедовский трюк:
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() и спи спокойно. Не усложняй себе жизнь, чувак.