Skip to main content

NaN

Що таке NaN

NaN - це спеціальне числове значення в JavaScript, що означає:

«Not a Number» - «не число».

Але водночас NaN сам має тип "number".

javascript
typeof NaN; // "number"

Тобто NaN - це просто невалідне числове значення. Воно з'являється, коли результат математичної операції не може бути виражений числом.


Коли з'являється NaN

Кілька типових випадків:

javascript
Number('hello'); // NaN - не вдалося перетворити рядок на число parseInt('abc'); // NaN 0 / 0; // NaN - математично невизначено Math.sqrt(-1); // NaN - не можна добути корінь з від'ємного числа 'abc' * 3; // NaN - рядок не можна помножити undefined + 5; // NaN

Як перевірити значення на NaN

isNaN(value) - стара функція

javascript
isNaN(NaN); // true isNaN('hello'); // true (!) isNaN('123'); // false

Проблема: isNaN спочатку приводить значення до числа, а потім перевіряє, чи є воно NaN. Тому рядок 'hello' → NaN, і результат - true.


Number.isNaN(value) - сучасний і правильний спосіб

javascript
Number.isNaN(NaN); // true Number.isNaN('hello'); // false Number.isNaN(undefined); // false Number.isNaN(5); // false Number.isNaN(0 / 0); // true

Number.isNaN() не приводить аргумент до числа, і працює тільки якщо значення дійсно дорівнює NaN.


Чому NaN === NaN повертає false

Це може здатися дивним, але це особливість IEEE 754 - стандарту, за яким JavaScript реалізує числа з рухомою комою.

Згідно зі стандартом IEEE-754, NaN не дорівнює навіть самому собі.

Тому що NaN - це не конкретне значення, а маркер помилки обчислення, і таких «помилкових» станів може бути багато (різні комбінації бітів → різні види NaN).

Тому:

javascript
NaN === NaN; // false NaN == NaN; // false

Як коректно перевірити, що значення - NaN

Правильний спосіб:

javascript
Number.isNaN(value);

або якщо хочеш коротко:

javascript
const isReallyNaN = x => x !== x; isReallyNaN(NaN); // true, тому що тільки NaN !== NaN

Фішка: NaN - це єдине значення в JS, яке не дорівнює самому собі.


Підсумок

ПеревіркаРезультатКоментар
typeof NaN"number"Тип - число, хоча позначає «не число»
NaN === NaNfalseЗгідно з IEEE-754
isNaN('text')trueПриведення до числа (поганий варіант)
Number.isNaN('text')falseСучасний правильний варіант
Number.isNaN(NaN)trueПеревірка без приведення типів

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.