> Что такое NaN и в каких случаях он возникает (JavaScript)

Уровень: junior · Роль: frontend · Категория: Технические вопросы

Компании: Инити, Globaldrive

Стек: JavaScript

> Пример ответа

Короткий ответ

NaN (Not-a-Number) - это специальное значение в JavaScript, которое возникает, когда математическая операция не может вернуть корректное число. Типичные случаи: деление 0/0, parseInt('abc'), Math.sqrt(-1), undefined + 5, или явное преобразование нечисловой строки в число. NaN имеет тип number, но не равен самому себе - проверка на NaN выполняется через Number.isNaN().

Подробное объяснение

NaN - это глобальное свойство объекта Number, представляющее результат ошибочной математической операции. В JavaScript NaN ведёт себя необычно:

  • Тип: typeof NaN возвращает 'number', что может сбивать с толку
  • Самонеравенство: NaN === NaN всегда false - это единственное значение в JS, которое не равно себе
  • Распространение: любая операция с NaN возвращает NaN (например, NaN + 5 → NaN)
  • Проверка: использовать Number.isNaN() или Object.is(NaN, NaN) - последний корректно возвращает true

Основные причины возникновения:

  1. Деление нуля на ноль: 0/0
  2. Неудачное преобразование строки: parseInt('hello'), Number('abc')
  3. Математические операции с нечисловыми значениями: Math.sqrt(-1), Math.log(-5)
  4. Арифметика с undefined: 5 + undefined
  5. Результат операций с NaN: NaN * 10

На практике

В реальной разработке NaN часто появляется при:

  • Парсинге пользовательского ввода (например, из формы)
  • Работе с API, где поля могут быть null или undefined
  • Математических расчётах с некорректными данными
  • Сравнении чисел, полученных из разных источников

Важно всегда проверять результат математических операций на NaN перед использованием в вычислениях или отображении. Для этого используйте Number.isNaN(), а не глобальную isNaN(), так как последняя сначала преобразует аргумент к числу, что может дать ложноположительные результаты (например, isNaN('abc') → true, хотя 'abc' - строка, а не NaN).

Пример кода

JAVASCRIPT
// Возникновение NaN
console.log(0 / 0); // NaN
console.log(parseInt('abc')); // NaN
console.log(Math.sqrt(-1)); // NaN
console.log(undefined + 5); // NaN
console.log(Number('hello')); // NaN
// Проверка на NaN
const value = 0 / 0;
// Неправильно:
console.log(value === NaN); // false - так делать нельзя
// Правильно:
console.log(Number.isNaN(value)); // true
console.log(Object.is(value, NaN)); // true
// Опасность глобальной isNaN:
console.log(isNaN('строка')); // true - преобразует строку в NaN
console.log(Number.isNaN('строка')); // false - строка не NaN
// Практический пример
function safeDivide(a, b) {
const result = a / b;
if (Number.isNaN(result)) {
return 'Деление невозможно';
}
return result;
}
console.log(safeDivide(10, 2)); // 5
console.log(safeDivide(0, 0)); // 'Деление невозможно'

Как отвечать на собеседовании

Начни с чёткого определения NaN как специального числового значения, обозначающего "не число". Приведи 2-3 типичных примера возникновения. Обязательно упомяни ключевую особенность - NaN не равен самому себе. Покажи знание правильного способа проверки через Number.isNaN() и объясни, почему не стоит использовать глобальную isNaN(). Если спросят про тип, скажи, что typeof NaN - 'number', и это исторически сложившаяся особенность. Закончи практическим примером обработки NaN в реальном коде.

Что проверяет интервьюер

  • Понимание специальных значений в JavaScript
  • Знание особенностей NaN (самонеравенство, тип number)
  • Умение правильно проверять на NaN
  • Понимание разницы между глобальной isNaN и Number.isNaN
  • Способность предвидеть и обрабатывать ошибочные ситуации в коде

Типичные ошибки

  • Проверка через value === NaN - это всегда false
  • Использование глобальной isNaN() без учёта приведения типов
  • Утверждение, что NaN имеет тип undefined или null
  • Игнорирование NaN в цепочках вычислений, что приводит к неожиданным результатам
  • Путаница между NaN и null/undefined при обработке ошибок

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью