Почему получается NaN в JavaScript и как от него избавиться?
Считаю что-то простое, а в результате NaN. Что вообще такое этот NaN, откуда он берётся при вычислениях и как проверить/исправить, чтобы получалось нормальное число?
2 ответа
NaN = «Not a Number», особое значение-результат, когда математика не имеет смысла. Появляется, когда ты пытаешься считать с тем, что в число не превращается.
Главные источники:
1. Арифметика со строкой, которая не число:
Number('abc'); // NaN
'привет' * 2; // NaN
parseInt('px'); // NaN
2. Значение из input не преобразовано:
const x = document.querySelector('#a').value; // строка, например '' (пусто)
console.log(x * 2); // NaN, если поле пустое или с буквами
3. Обращение к несуществующему полю в расчёте:
const obj = {};
console.log(obj.price * 2); // undefined * 2 = NaN
4. Деление/операции, типа 0/0 → NaN.
Как проверить: ВАЖНО — NaN === NaN это false (NaN не равен сам себе!). Поэтому обычное сравнение не работает. Используй Number.isNaN:
const n = Number('abc');
Number.isNaN(n); // true
n === NaN; // false — НЕ так!
Как избавиться: подстрахуй преобразование дефолтом:
const x = Number(input.value) || 0; // NaN → 0
const price = Number(obj.price) || 0;
|| 0 срабатывает, потому что NaN — ложное значение. Так расчёт не сломается, даже если данные пустые.
Коварная черта NaN — он заразный: одно NaN в цепочке делает NaN весь результат.
const total = 10 + 20 + Number('x') + 5;
console.log(total); // NaN — всё испорчено одним слагаемым
Поэтому при отладке ищи первое место, где появилось NaN, логируя промежуточные значения. Обычно виновата необработанная строка из формы или поле объекта, которого нет.