isNaN()
- Что такое isNaN()
- Синтаксис
- Что такое NaN
- Как работает isNaN()
- Проверка после Number()
- isNaN() и строки
- Почему результат может удивить
- Number.isNaN()
- isNaN() и prompt()
- Когда использовать isNaN()
- Итого
isNaN() - это встроенная функция JavaScript, которая проверяет, получилось ли значение NaN.
NaN появляется, когда JavaScript пытался получить число, но не смог. Например, если преобразовать строку ‘JavaScript’ в число.
let value = Number('JavaScript');
console.log(value);
console.log(isNaN(value));
Результат:
NaN
true
Функция вернула true, потому что в переменной value лежит NaN.
Что такое isNaN()
isNaN() проверяет значение и возвращает логический результат: true или false.
Если значение является NaN или превращается в NaN при числовом преобразовании, результат будет true.
console.log(isNaN(NaN));
console.log(isNaN('JavaScript'));
Результат:
true
true
Если значение можно нормально представить как число, результат будет false.
console.log(isNaN(25));
console.log(isNaN('25'));
Результат:
false
false
На первый взгляд это может выглядеть странно: строка ‘25’ не является числом. Но isNaN() сначала пытается преобразовать ее в число, а потом уже проверяет результат.
Синтаксис
Общая запись выглядит так:
isNaN(value);
value - значение, которое нужно проверить.
let result = isNaN('10');
console.log(result);
Результат:
false
Строка ‘10’ превращается в число 10, поэтому это не NaN.
Что такое NaN
NaN означает Not a Number, то есть “не число”.
Такое значение появляется, когда JavaScript ожидал получить число, но нормального числового результата не получилось.
console.log(Number('урок'));
console.log('JavaScript' * 2);
console.log(parseInt('px100', 10));
Результат:
NaN
NaN
NaN
Во всех трех случаях JavaScript пытался работать с числом, но исходные данные для этого не подошли.
У NaN есть необычная особенность: он не равен даже самому себе.
console.log(NaN === NaN);
Результат:
false
Именно поэтому для проверки используют специальные функции, например isNaN() или Number.isNaN().
Как работает isNaN()
isNaN() сначала пытается привести значение к числу, а потом проверяет, получилось ли NaN.
console.log(isNaN('100'));
console.log(isNaN('100px'));
console.log(isNaN('text'));
Результат:
false
true
true
Строка ‘100’ нормально превращается в число 100, поэтому результат false.
Строки ‘100px’ и ‘text’ через Number() превращаются в NaN, поэтому результат true.
Это поведение удобно, когда мы хотим проверить, можно ли значение использовать как число.
Проверка после Number()
Частый сценарий - сначала преобразовать значение через Number(), а потом проверить, получилось ли нормальное число.
let value = Number('15');
console.log(isNaN(value));
Результат:
false
Число получилось, поэтому isNaN() вернул false.
let value = Number('пятнадцать');
console.log(isNaN(value));
Результат:
true
В этом примере преобразование дало NaN, значит значение не подходит для обычных вычислений.
Такую проверку удобно использовать перед расчетами:
let value = Number('20');
if (isNaN(value)) {
console.log('Введите число');
} else {
console.log(value * 2);
}
Результат:
40
isNaN() и строки
Со строками важно помнить: isNaN() не просто смотрит на тип значения. Он пытается преобразовать строку в число.
console.log(isNaN('10'));
console.log(isNaN('10.5'));
console.log(isNaN('10px'));
console.log(isNaN('JavaScript'));
Результат:
false
false
true
true
Строки ‘10’ и ‘10.5’ можно превратить в числа, поэтому результат false.
Строки ‘10px’ и ‘JavaScript’ через Number() дают NaN, поэтому результат true.
Если нужно достать число из строки вроде ‘10px’, сначала используем parseInt() или parseFloat(), а потом проверяем результат.
let width = parseInt('10px', 10);
console.log(isNaN(width));
Результат:
false
Почему результат может удивить
Так как isNaN() выполняет числовое преобразование, некоторые значения дают не самый очевидный результат.
console.log(isNaN(''));
console.log(isNaN(' '));
console.log(isNaN(true));
console.log(isNaN(false));
console.log(isNaN(null));
console.log(isNaN(undefined));
Результат:
false
false
false
false
false
true
Пустая строка, строка из пробелов, false и null при числовом преобразовании дают 0. Значение true дает 1. Поэтому для них isNaN() возвращает false.
undefined превращается в NaN, поэтому результат true.
На первых порах главное запомнить: isNaN() отвечает не на вопрос “это тип number?”, а на вопрос “получится ли здесь NaN при попытке получить число?”.
Number.isNaN()
В JavaScript есть более строгая проверка - Number.isNaN().
Она возвращает true только тогда, когда переданное значение уже является настоящим NaN. Автоматического преобразования здесь нет.
console.log(Number.isNaN(NaN));
console.log(Number.isNaN(Number('text')));
console.log(Number.isNaN('text'));
console.log(Number.isNaN('10'));
Результат:
true
true
false
false
Строка ‘text’ сама по себе не является NaN, поэтому Number.isNaN(‘text’) возвращает false.
Если значение уже преобразовано в число, Number.isNaN() часто понятнее:
let value = Number('text');
console.log(Number.isNaN(value));
Результат:
true
Здесь в переменной value лежит именно NaN, поэтому строгая проверка сработала.
isNaN() и prompt()
prompt() всегда возвращает строку. Если пользователь должен ввести число, данные нужно преобразовать и проверить.
let value = prompt('Введите число');
let numberValue = Number(value);
if (isNaN(numberValue)) {
console.log('Это не число');
} else {
console.log(numberValue * 2);
}
Если пользователь введет 10, в консоли будет:
20
Если пользователь введет привет, в консоли будет:
Это не число
С пустой строкой нужно быть внимательным. Number(”) дает 0, поэтому isNaN() не посчитает пустой ввод ошибкой.
let value = '';
console.log(Number(value));
console.log(isNaN(Number(value)));
Результат:
0
false
Если пустой ввод запрещен, его лучше проверять отдельно до преобразования.
let value = prompt('Введите число');
if (value === '') {
console.log('Поле не должно быть пустым');
} else {
let numberValue = Number(value);
if (isNaN(numberValue)) {
console.log('Это не число');
} else {
console.log(numberValue);
}
}
Когда использовать isNaN()
isNaN() удобно использовать, когда нужно понять, можно ли значение использовать в вычислениях после числового преобразования.
let value = Number('35');
if (!isNaN(value)) {
console.log(value + 5);
}
Результат:
40
Если значение уже точно должно быть числом, часто лучше использовать Number.isNaN(). Так код становится строже и понятнее.
let value = Number('урок');
if (Number.isNaN(value)) {
console.log('Не получилось получить число');
}
Результат:
Не получилось получить число
Итого
isNaN() проверяет, получится ли NaN после попытки привести значение к числу. Если получается NaN, функция возвращает true. Если получается обычное число, возвращает false.
isNaN(value);
Главное запомнить: isNaN() выполняет автоматическое числовое преобразование. Поэтому для уже преобразованных значений часто удобнее и понятнее использовать строгую проверку Number.isNaN().