Number.isNaN: примеры (JAVASCRIPT)

Функция 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'))        # TypeError
    True
  • PHP: Функция is_nan($val). Работает аналогично глобальному isNaN() в JS, так как PHP динамически преобразует типы.
    var_dump(is_nan(NAN));           // true
    var_dump(is_nan('текст'));       // true
    var_dump(is_nan(123));           // false
    bool(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));     // true
true
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.

Расширенные и специальные примеры

Использование в функции валидации числовых данных:

Пример javascript
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:

Пример javascript
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 мс

Проверка значений, которые могут быть интерпретированы как числа:

Пример javascript
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 -> NaN
true
true
true

Работа с типизированными массивами:

Пример javascript
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

JS Number.isNaN function comments

En
Number.isNaN Determines whether the passed value is NaN, with more robust type-checking than isNaN.