
NaN расшифровывается как Not-a-Number и обозначает результат нечисловой операции, которая ожидала число. В JavaScript это специальное значение типа Number, что может приводить к путанице: переменная хранит число, но на деле оно невалидно для вычислений.
Например, выражение 0 / 0 или преобразование строки "abc" через Number("abc") возвращает NaN. При этом typeof NaN выдаёт "number", что часто вводит разработчиков в заблуждение.
Проверка на NaN через стандартное сравнение (value === NaN) никогда не сработает, так как NaN не равен самому себе. Для корректной проверки используют Number.isNaN(value), а также Object.is(value, NaN). В отличие от глобальной функции isNaN(), метод Number.isNaN() не преобразует аргумент к числу и возвращает ожидаемый результат.
Использование NaN в вычислениях всегда даёт NaN. Это означает, что если одна операция вернула NaN, все последующие результаты на его основе также будут NaN. Чтобы избежать этого, полезно проверять входные данные заранее и обрабатывать ошибки преобразования типов.
Когда появляется значение NaN при вычислениях

NaN возникает при операциях с числами, если результат невозможно выразить в виде корректного значения. Например, деление строки без числового представления на число: "abc" / 2.
Функции преобразования могут вернуть NaN, если переданные данные не интерпретируются как число. Пример: Number("12px") вернёт NaN.
Математические операции с undefined приводят к NaN. Например: undefined + 5.
Операции с результатом, который выходит за пределы определений. Например, Math.sqrt(-1) вернёт NaN, так как квадратный корень из отрицательного числа не определён в обычной арифметике JavaScript.
Передача нечисловых значений в функции, ожидающие число, также даёт NaN. Пример: Math.log("текст").
Особенности сравнения NaN с другими значениями
NaN в JavaScript не равен ни одному значению, включая сам себя. Выражение NaN === NaN всегда возвращает false. Это связано с тем, что стандарт IEEE 754 определяет NaN как результат некорректных арифметических операций, и такое значение не может быть сопоставлено напрямую.
Операторы строгого и нестрогого равенства (===, ==) не подходят для проверки NaN. Для этого используется функция Number.isNaN(), которая возвращает true только в случае точного совпадения с NaN, не преобразуя тип.
Глобальная функция isNaN() менее надёжна, так как перед сравнением выполняет приведение типов. Например, isNaN("строка") вернёт true, хотя это не NaN, а строка.
Для поиска NaN в массиве метод indexOf() бесполезен, так как он основан на строгом сравнении. Вместо этого следует применять array.includes(NaN), так как метод includes() учитывает специфику NaN и корректно его определяет.
Различие между NaN и undefined
undefined – это примитив, указывающий на отсутствие значения. Он возникает, если переменная объявлена, но не инициализирована, либо при доступе к несуществующему свойству объекта. Тип typeof undefined возвращает "undefined".
NaN участвует в математических вычислениях и распространяется при любых операциях с ним. undefined не преобразуется к числу напрямую, кроме случаев приведения через Number(undefined), что возвращает NaN.
Для проверки NaN используйте Number.isNaN(). Для проверки undefined – строгое сравнение value === undefined. Эти проверки не взаимозаменяемы.
Использование функции isNaN и её ограничения

Функция isNaN(value) проверяет, можно ли преобразовать аргумент в число. Если результат преобразования равен NaN, возвращается true. Например: isNaN('текст') → true, так как строка не может быть преобразована в число.
Главный недостаток в том, что isNaN выполняет неявное приведение типов. Так, isNaN('42') возвращает false, потому что строка успешно преобразуется в число 42. Из-за этого проверка может вводить в заблуждение при работе со строковыми данными.
Для надёжного определения именно значения NaN рекомендуется использовать Number.isNaN(), так как эта функция не выполняет приведение типов и возвращает true только в случае точного совпадения с NaN.
Рекомендация: применять isNaN только там, где требуется проверить корректность преобразования в число, и использовать Number.isNaN для точной проверки значения.
Зачем нужен Number.isNaN и чем он отличается от isNaN
Функция isNaN() преобразует аргумент к числу перед проверкой. Это приводит к ложноположительным результатам: например, строка "abc" после преобразования становится NaN, и isNaN("abc") возвращает true.
Number.isNaN() не выполняет приведение типов. Он возвращает true только если значение строго равно NaN, что делает его предпочтительным для точной проверки.
| Вызов | isNaN() | Number.isNaN() |
|---|---|---|
isNaN(NaN) |
true | true |
isNaN("abc") |
true | false |
isNaN(undefined) |
true | false |
isNaN(123) |
false | false |
isNaN("123") |
false | false |
Используйте Number.isNaN() в любых случаях, где требуется строгая проверка значения без автоматического преобразования. Это исключает ошибки при работе со строками и неопределёнными значениями.
Проверка результата вычислений на NaN

В JavaScript NaN обозначает результат некорректного числового вычисления, например, деление 0 на 0 или преобразование нечисловой строки в число. Проверка на NaN требует внимательности, так как стандартное сравнение через == или === всегда возвращает false для NaN.
Для точного определения NaN используют следующие подходы:
Number.isNaN(value)– проверяет, является ли значение строго NaN. Возвращаетtrueтолько для NaN иfalseдля любых других типов.isNaN(value)– глобальная функция, сначала пытается преобразовать значение в число, а затем проверяет результат. Может возвращатьtrueдля нечисловых строк и других значений, не являющихся NaN напрямую.
Примеры использования:
-
Случай с Number.isNaN:
let result = 0 / 0; console.log(Number.isNaN(result)); // true -
Случай с глобальной функцией isNaN:
console.log(isNaN("текст")); // true console.log(Number.isNaN("текст")); // false
Для комплексных вычислений рекомендуется проверять результат каждой операции, которая может привести к NaN, особенно при работе с пользовательским вводом или внешними данными:
- Перед арифметическими операциями преобразовывать данные через
Number()илиparseFloat(). - Использовать цепочку проверок с
Number.isNaN()после ключевых вычислений. - Для массивов или объектов с числовыми свойствами применять
Array.prototype.map()и фильтровать NaN черезNumber.isNaN().
Игнорирование проверки на NaN может привести к неожиданным ошибкам, так как любые операции с NaN всегда возвращают NaN, что нарушает логику вычислений.
NaN в массивах и объектах
В JavaScript NaN может появляться внутри массивов и объектов при некорректных арифметических операциях или преобразованиях типов. Например, выражение Number("abc") возвращает NaN, который можно присвоить элементу массива или значению свойства объекта.
Проверка на NaN в массивах требует использования функции Number.isNaN(), так как обычное сравнение через === всегда возвращает false: Number.isNaN(arr[2]).
Для фильтрации NaN из массива удобно применять метод filter: arr = arr.filter(value => !Number.isNaN(value));. Это сохраняет только числовые значения.
В объектах NaN чаще встречается при обработке пользовательских данных или вычислений. Рекомендуется проверять свойства перед выполнением арифметики: if (!Number.isNaN(obj.key)) { ... }.
Методы Object.values() и Object.entries() позволяют выявлять и корректировать NaN в объектах: можно заменить их на дефолтное число или удалить соответствующие свойства.
Для безопасной сериализации объектов с NaN используйте JSON.stringify(), так как NaN автоматически преобразуется в null, что предотвращает ошибки при передаче данных.
NaN в массивах и объектах нельзя игнорировать: при математических операциях он распространяется и может искажать результаты, поэтому регулярная проверка и фильтрация критически важны для точности вычислений.
Практические примеры ошибок, связанных с NaN

В JavaScript NaN возникает при невозможности корректного вычисления числа. Часто это приводит к логическим ошибкам и некорректной работе программы. Ниже приведены типичные случаи и способы их предотвращения.
- Деление на ноль или некорректное преобразование типов:
Пример:
let result = "abc" / 5;вернёт NaN, так как строка не может быть преобразована в число.Рекомендация: использовать
Number()илиparseFloat()с проверкойisNaN()перед вычислениями. - Операции с неопределёнными переменными:
Пример:
let x; let y = x * 10;– y станет NaN, так как x не инициализирована.Рекомендация: всегда задавать начальное значение переменным, особенно числовым.
- Некорректный ввод пользователя:
Пример:
let age = Number(prompt("Введите возраст"));и пользователь вводит текст вместо числа – переменная age станет NaN.Рекомендация: использовать проверку
!isNaN(age)и повторный запрос при некорректном вводе. - Неправильные математические функции:
Пример:
Math.sqrt(-4)вернёт NaN, так как квадратный корень из отрицательного числа не определён в реальных числах.Рекомендация: проверять аргументы математических функций и использовать условные проверки.
- Ошибки при работе с массивами:
Пример:
let arr = ["10", "abc"]; let sum = arr.reduce((a, b) => a + Number(b), 0);– результат NaN из-за некорректного элемента.Рекомендация: фильтровать массив перед вычислениями:
arr.filter(el => !isNaN(Number(el))).
Использование NaN в логике условий без явной проверки также вызывает ошибки. Например:
if (x > 5)не сработает корректно, если x = NaN.- Решение: проверять
!isNaN(x)перед сравнением.
Регулярная проверка значений и явное преобразование типов существенно сокращает ошибки, связанные с NaN, и делает код предсказуемым.
Вопрос-ответ:
Что означает значение NaN в JavaScript?
NaN расшифровывается как «Not a Number» и обозначает результат операции, которая не может быть выражена числом. Например, деление нуля на ноль или попытка преобразовать строку, не содержащую цифры, в число, вернет NaN.
Почему NaN не равен самому себе?
В JavaScript NaN — это особое значение, которое считается неравным даже самому себе. Поэтому простое сравнение NaN === NaN вернет false. Чтобы проверить, является ли значение NaN, используют функцию isNaN() или Number.isNaN().
Как отличить NaN от других значений в коде?
Для проверки используют метод Number.isNaN(), который точно определяет, является ли переменная NaN. В отличие от глобальной функции isNaN(), Number.isNaN() не преобразует аргумент в число, что делает проверку более надежной.
Можно ли работать с NaN в математических вычислениях?
NaN распространяется через все математические операции. Например, если сложить число с NaN, результатом снова будет NaN. Поэтому перед проведением вычислений важно убедиться, что все значения корректные числа.
Как предотвратить появление NaN при обработке данных?
Чтобы избежать NaN, нужно проверять входные данные перед вычислениями. Например, при преобразовании строки в число стоит использовать функции parseInt или parseFloat с проверкой результата на NaN. Также полезно контролировать деление на ноль и другие операции, которые могут вернуть некорректное число.
Почему результат выражения 0/0 в JavaScript равен NaN?
В JavaScript NaN обозначает «не число» и появляется, когда математическая операция не может дать корректный числовой результат. В случае 0/0 деление неопределено в математике, поэтому интерпретатор возвращает NaN. Это помогает программам распознавать ошибочные вычисления и предотвращает их использование в дальнейших числовых операциях без проверки.
Как проверить, что значение действительно NaN, а не просто другое число?
Прямое сравнение через == или === не работает, потому что NaN не равен сам себе. Чтобы определить, является ли значение NaN, используют функцию Number.isNaN(). Например, Number.isNaN(NaN) вернёт true, а Number.isNaN(«text») — false. Также есть старая глобальная функция isNaN(), но она сначала пытается преобразовать аргумент в число, что иногда даёт неожиданный результат, поэтому предпочтительнее Number.isNaN().
