isNaN() проверяет, станет ли значение NaN после приведения к числу.
Это глобальная функция JavaScript. Она работает не так строго, как Number.isNaN(), потому что сначала пытается преобразовать значение.
Синтаксис
isNaN(value)
value - значение, которое нужно проверить.
Что делает isNaN()
Функция сначала пытается превратить значение в число, а потом проверяет, получился ли NaN.
console.log(isNaN(NaN)); // true
console.log(isNaN("hello")); // true
console.log(isNaN("123")); // false
Из-за этого isNaN() отвечает не только на вопрос “это NaN?”, но скорее на вопрос “можно ли из этого получить нормальное число?”.
Что возвращает isNaN()
isNaN() всегда возвращает булево значение:
true, если после приведения получаетсяNaNfalse, если значение можно превратить в число
console.log(isNaN("123")); // false
console.log(isNaN("abc")); // true
console.log(isNaN(42)); // false
Неявное приведение типов
Это главный нюанс функции.
isNaN() не проверяет значение “как есть”, а сначала приводит его к числу.
console.log(isNaN("123")); // false
console.log(isNaN("")); // false
console.log(isNaN(null)); // false
Почему так:
"123"превращается в123""превращается в0nullпревращается в0
Поэтому результат иногда выглядит неожиданно.
isNaN() и Number.isNaN()
Это самая важная пара для сравнения.
console.log(isNaN("hello")); // true
console.log(Number.isNaN("hello")); // false
isNaN()сначала приводит значение к числуNumber.isNaN()ничего не приводит и проверяет только настоящийNaN
Ещё пример:
console.log(isNaN(undefined)); // true
console.log(Number.isNaN(undefined)); // false
Если нужна точная проверка именно на NaN, чаще лучше использовать Number.isNaN().
Когда isNaN() может быть полезен
isNaN() удобен, когда нужно быстро понять, можно ли из значения получить число.
console.log(isNaN("42")); // false
console.log(isNaN("42px")); // true
То есть функция может пригодиться для грубой проверки пользовательского ввода.
isNaN() и Number()
По сути, isNaN() ведёт себя так, как будто внутри сначала вызывается Number().
console.log(Number("123")); // 123
console.log(isNaN("123")); // false
А здесь преобразование не удаётся:
console.log(Number("hello")); // NaN
console.log(isNaN("hello")); // true
Неожиданные примеры
Вот несколько случаев, на которых чаще всего спотыкаются:
console.log(isNaN("")); // false
console.log(isNaN(" ")); // false
console.log(isNaN(true)); // false
console.log(isNaN([])); // false
console.log(isNaN([123])); // false
console.log(isNaN([1, 2])); // true
console.log(isNaN({})); // true
Это происходит именно из-за автоматического приведения типов.
После parseInt() и parseFloat()
После числового парсинга обычно удобнее уже не isNaN(), а Number.isNaN().
const value = parseFloat("hello");
console.log(isNaN(value)); // true
console.log(Number.isNaN(value)); // true
Но если число уже получено, более точной и читаемой обычно считается именно проверка через Number.isNaN().
Когда это полезно
isNaN() удобно использовать, когда:
- нужно быстро проверить, похоже ли значение на число
- не страшно неявное приведение типов
- вы осознанно хотите проверять результат преобразования, а не только настоящий
NaN
Пример:
if (isNaN(userInput)) {
console.log("Введите число");
}
Для простой валидации ввода такой вариант иногда встречается.
Частые ошибки
Думать, что isNaN() проверяет только настоящий NaN
console.log(isNaN("hello")); // true
Но строка "hello" сама по себе не равна NaN. Просто после преобразования она становится NaN.
Использовать isNaN() там, где нужна строгая проверка
console.log(isNaN(null)); // false
console.log(Number.isNaN(null)); // false
Здесь проблема в том, что isNaN(null) возвращает false не потому, что null - число, а потому что null превращается в 0.
Удивляться результатам для пустых строк и массивов
console.log(isNaN("")); // false
console.log(isNaN([])); // false
console.log(isNaN([123])); // false
Это нормальное поведение для глобальной isNaN(), но именно поэтому она часто кажется “слишком магической”.
Быстрая памятка
isNaN()- это глобальная функция- она сначала приводит значение к числу
- возвращает
true, если результатом становитсяNaN - из-за приведения типов результат может быть неожиданным
- для точной проверки настоящего
NaNчаще лучшеNumber.isNaN()
Коротко
isNaN() - это не строгая проверка на NaN, а проверка того, получится ли из значения нормальное число после преобразования. Главное, что стоит запомнить: из-за неявного приведения типов в современном коде её часто используют осторожно, а для точной проверки предпочитают Number.isNaN().