← Назад к вопросам

Почему NaN относится к типу number?

1.0 Junior🔥 181 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Почему NaN относится к типу number?

NaN (Not-a-Number) — это парадоксальное, но логичное значение в JavaScript, которое представляет результат некорректных математических операций. Несмотря на своё название, NaN **буквально является числом** с точки зрения типизации JavaScript.

Историческая причина

NaN был введён в стандарт IEEE 754, который определяет представление чисел с плавающей точкой во всех современных языках программирования. В этом стандарте NaN — это специальное числовое значение, представленное определённым бинарным шаблоном в памяти. Когда Brendan Eich создавал JavaScript, он следовал этому стандарту, поэтому NaN наследовал тип number.

typeof NaN; // number
console.log(0/0); // NaN — результат этой операции имеет тип number

Когда возникает NaN?

NaN возникает в результате недействительных или неопределённых числовых операций:

// Парсинг несчисляемых строк
parseInt("hello"); // NaN
parseFloat("abc123"); // NaN

// Математические операции
Math.sqrt(-1); // NaN
0 / 0; // NaN
Infinity - Infinity; // NaN

// Арифметические ошибки
undefined + 5; // NaN
"text" * 2; // NaN
Number("не число"); // NaN

Логика стандарта IEEE 754

В стандарте IEEE 754 для чисел с плавающей точкой предусмотрено место для специальных значений:

  • Infinity (положительная и отрицательная бесконечность)
  • NaN (результат недействительных операций)

Эти значения являются частью множества чисел с плавающей точкой. JavaScript сохранил эту архитектуру:

typeof NaN; // "number"
typeof Infinity; // "number"
typeof -Infinity; // "number"

Проверка на NaN

Здесь есть важный подвох: NaN — единственное значение в JavaScript, которое не равно самому себе:

NaN === NaN; // false! Даже не true

// Правильный способ проверки:
isNaN(NaN); // true (но может быть неточным)
Number.isNaN(NaN); // true (безопасный способ)

// Или использовать Object.is()
Object.is(NaN, NaN); // true

Способ isNaN() опасен, потому что сначала преобразует аргумент в число:

isNaN("hello"); // true (преобразовалось в NaN)
Number.isNaN("hello"); // false (не преобразует, просто проверяет)

Практическое применение

При работе с данными часто нужно проверить, что результат вычисления — валидное число:

function divideNumbers(a, b) {
  const result = a / b;
  if (Number.isNaN(result)) {
    return "Ошибка: недействительная операция";
  }
  return result;
}

divideNumbers(10, 2); // 5
divideNumbers(0, 0); // "Ошибка: недействительная операция"

Заключение

NaN имеет тип number по стандарту IEEE 754, который определяет архитектуру чисел с плавающей точкой. Это историческое решение, которое JavaScript унаследовал от C и других языков. Несмотря на кажущееся противоречие в названии, NaN логически принадлежит к типу number, так как это специальное числовое значение, а не строка, объект или какой-то другой тип данных.