Number.isNaN: примеры (JAVASCRIPT)
Number.isNaN(value: any): booleanОписание функции Number.isNaN
Функция Number.isNaN() является статическим методом объекта Number в JavaScript. Ее основное назначение – определение, является ли переданное значение NaN (Not-a-Number), при этом тип значения должен быть числовым.
Метод используется для надежной проверки на специальное значение NaN, которое возникает в результате математических операций, не возвращающих числовой результат (например, деление нуля на ноль).
Синтаксис: Number.isNaN(value)
- Параметр:
value– любое значение, которое требуется проверить. - Возвращаемое значение: логическое значение
trueилиfalse.- Возвращает
true, только если переданное значение имеет типNumberи являетсяNaN. - Во всех остальных случаях возвращает
false, включая ситуации, когда переданы другие типы данных, даже если они «не являются числом».
- Возвращает
Базовые примеры использования
Различные варианты вызова функции и ее результаты.
Проверка специального значения NaN:
console.log(Number.isNaN(NaN));true
Проверка числовых значений, не являющихся NaN:
console.log(Number.isNaN(123));
console.log(Number.isNaN(-12.5));
console.log(Number.isNaN(0 / 5));false false false
Проверка нечисловых значений (всегда false):
console.log(Number.isNaN('строка'));
console.log(Number.isNaN(undefined));
console.log(Number.isNaN(null));
console.log(Number.isNaN(true));
console.log(Number.isNaN({}));false false false false false
Проверка результата невалидной математической операции:
let result = Math.sqrt(-1); // NaN
console.log(Number.isNaN(result));true
Похожие функции в JavaScript
- Глобальная функция isNaN() – выполняет преобразование переданного аргумента к числу перед проверкой. Это приводит к неочевидным результатам:
isNaN('строка')вернетtrue, потому что строка преобразуется в NaN.Number.isNaN()более строгая и предсказуемая. - Метод Object.is() – может использоваться для проверки на NaN:
Object.is(value, NaN). Это низкоуровневое сравнение, работает аналогичноNumber.isNaN(), но с более сложным синтаксисом. - Проверка через самосравнение:
value !== value. По спецификации только NaN в JavaScript не равен самому себе. Этот способ рабочий, но менее читаемый.
Функцию Number.isNaN() предпочтительнее использовать для явной и строгой проверки именно числового значения NaN. Глобальный isNaN() может быть полезен, когда нужно определить, является ли значение (после приведения к числу) NaN, что эквивалентно проверке isNaN(Number(value)).
Аналоги в других языках программирования
- Python: Используется функция
math.isnan(x)из модуля math. Она принимает только числа, для других типов вызывает TypeError. Также естьnumpy.isnan()для массивов.import math print(math.isnan(float('nan'))) # True print(math.isnan('text')) # TypeErrorTrue
- PHP: Функция
is_nan($val). Работает аналогично глобальному isNaN() в JS, так как PHP динамически преобразует типы.var_dump(is_nan(NAN)); // true var_dump(is_nan('текст')); // true var_dump(is_nan(123)); // falsebool(true) bool(true) bool(false)
- C/C++: Используется макрос
isnan()из<math.h>. Работает только с числами с плавающей запятой.#include <math.h> #include <stdio.h> int main() { double x = 0.0 / 0.0; printf("%d", isnan(x)); // 1 return 0; }1
- MySQL: Для проверки используется функция
ISNULL()или сравнение<=>(безопасное сравнение с NULL), так как NaN не поддерживается как отдельное значение. В арифметических операциях при ошибке возвращается NULL.
Типичные ошибки при использовании
Основная ошибка – путаница с глобальной функцией isNaN(), которая приводит аргумент к числу.
// Неожиданное поведение при использовании глобального isNaN
console.log(isNaN('Hello')); // true
console.log(Number.isNaN('Hello')); // false
// Ошибка в логике: попытка проверить результат сразу нескольких операций
let x = 'строка';
let y = 10;
console.log(Number.isNaN(x * y)); // false, потому что x * y = NaN, но проверяется это значение?
// На самом деле код работает, но может быть нелогичным.
// Правильнее:
let res = x * y; // res будет NaN
console.log(Number.isNaN(res)); // truetrue false false true
Еще одна ошибка – попытка использовать Number.isNaN() для валидации ввода, ожидая, что она вернет true для любой нечисловой строки. Это не так.
function validateInput(input) {
// Неправильно: функция не сработает для строк
if (Number.isNaN(input)) {
console.log('Некорректное число');
} else {
console.log('Корректное значение');
}
}
validateInput('123abc'); // Выведет 'Корректное значение', хотя строка не числоКорректное значение
Изменения в последних версиях
Метод Number.isNaN() был добавлен в стандарт ECMAScript 6 (ES2015). До этого разработчики использовали глобальную функцию isNaN() или проверку value !== value.
С момента внедрения в ES6 спецификация функции не менялась. Она поддерживается во всех современных браузерах и средах выполнения (Node.js).
Единственное важное изменение связано с полифилами для старых сред. Ранние реализации полифилов могли иметь отличия в деталях, но современные следуют строгой спецификации: проверка типа и сравнение с NaN.
Расширенные и специальные примеры
Использование в функции валидации числовых данных:
function cleanAndValidateDataSet(dataArray) {
return dataArray.filter(item => {
// Отфильтровываем именно значение NaN, оставляя все остальные числа (включая Infinity)
return typeof item === 'number' && !Number.isNaN(item);
});
}
let data = [12, NaN, 'текст', null, 0, -5, Infinity, undefined, NaN];
console.log(cleanAndValidateDataSet(data));[12, 0, -5, Infinity]
Сравнение производительности различных способов проверки на NaN:
let testVal = NaN;
console.time('Number.isNaN');
for (let i = 0; i < 1e7; i++) Number.isNaN(testVal);
console.timeEnd('Number.isNaN');
console.time('isNaN');
for (let i = 0; i < 1e7; i++) isNaN(testVal);
console.timeEnd('isNaN');
console.time('Self-comparison');
for (let i = 0; i < 1e7; i++) testVal !== testVal;
console.timeEnd('Self-comparison');Number.isNaN: ~50 мс isNaN: ~200 мс Self-comparison: ~20 мс
Проверка значений, которые могут быть интерпретированы как числа:
console.log(Number.isNaN(parseInt('ABC'))); // true, т.к. parseInt('ABC') -> NaN
console.log(Number.isNaN(Number('123abc'))); // true, т.к. Number('123abc') -> NaN
console.log(Number.isNaN(Math.acos(2))); // true, арккосинус от 2 -> NaNtrue true true
Работа с типизированными массивами:
let floatArray = new Float64Array([1.5, NaN, 3.7, NaN, 5.1]);
let nanCount = 0;
for (let val of floatArray) {
if (Number.isNaN(val)) nanCount++;
}
console.log(`Найдено значений NaN: ${nanCount}`);Найдено значений NaN: 2