Функция isNaN
(Is Not a Number) — это встроенная функция JavaScript, которая проверяет, является ли переданное значение "не числом" (NaN). Однако её поведение часто вызывает путаницу из-за особенностей приведения типов.
Базовая логика:
true
, если значение равно NaN
false
для любых корректных чиселПримеры:
isNaN(NaN); // true
isNaN(123); // false
isNaN('123'); // false (строка преобразуется в число)
isNaN('Hello'); // true (не может быть преобразовано в число)
Неочевидное поведение: Функция сначала пытается преобразовать значение к числу:
isNaN(undefined); // true
isNaN(null); // false (null преобразуется в 0)
isNaN(''); // false (пустая строка преобразуется в 0)
isNaN(true); // false (true → 1)
Главная проблема оригинальной isNaN
— агрессивное приведение типов. Поэтому в ES6 появилась улучшенная версия:
Number.isNaN('Hello'); // false (строго проверяет NaN)
Number.isNaN(NaN); // true
Различия: | Значение | isNaN() | Number.isNaN() | |----------------|---------|----------------| | NaN | true | true | | "Hello" | true | false | | undefined | true | false | | {} | true | false | | "123" | false | false |
Оригинальная isNaN:
Number.isNaN:
NaN
function validateInput(value) {
if (Number.isNaN(Number(value))) {
console.log('Введите корректное число');
}
}
const data = [1, 2, '3', NaN, 'text'];
const numbers = data.filter(item => !isNaN(item));
// [1, 2, '3', 'text'] (NaN отфильтрован)
if (!Number.isNaN) {
Number.isNaN = function(value) {
return typeof value === 'number' && isNaN(value);
};
}
Для проверки "числовости" значения часто лучше использовать:
function isNumeric(value) {
return !isNaN(parseFloat(value)) && isFinite(value);
}
isNaN
— это функция с неочевидной логикой приведения типов, тогда как Number.isNaN
выполняет строгую проверку. Для большинства современных приложений следует использовать Number.isNaN
, а классическую isNaN
применять только в случаях, когда нужно проверить преобразуемость значения в число.