NaN
Що таке NaN
NaN - це спеціальне числове значення в JavaScript, що означає:
«Not a Number» - «не число».
Але водночас NaN сам має тип "number".
typeof NaN; // "number"Тобто
NaN- це просто невалідне числове значення. Воно з'являється, коли результат математичної операції не може бути виражений числом.
Коли з'являється NaN
Кілька типових випадків:
Number('hello'); // NaN - не вдалося перетворити рядок на число
parseInt('abc'); // NaN
0 / 0; // NaN - математично невизначено
Math.sqrt(-1); // NaN - не можна добути корінь з від'ємного числа
'abc' * 3; // NaN - рядок не можна помножити
undefined + 5; // NaNЯк перевірити значення на NaN
isNaN(value) - стара функція
isNaN(NaN); // true
isNaN('hello'); // true (!)
isNaN('123'); // falseПроблема: isNaN спочатку приводить значення до числа,
а потім перевіряє, чи є воно NaN.
Тому рядок 'hello' → NaN, і результат - true.
Number.isNaN(value) - сучасний і правильний спосіб
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).
Тому:
NaN === NaN; // false
NaN == NaN; // falseЯк коректно перевірити, що значення - NaN
Правильний спосіб:
Number.isNaN(value);або якщо хочеш коротко:
const isReallyNaN = x => x !== x;
isReallyNaN(NaN); // true, тому що тільки NaN !== NaNФішка:
NaN- це єдине значення в JS, яке не дорівнює самому собі.
Підсумок
| Перевірка | Результат | Коментар |
|---|---|---|
typeof NaN | "number" | Тип - число, хоча позначає «не число» |
NaN === NaN | false | Згідно з IEEE-754 |
isNaN('text') | true | Приведення до числа (поганий варіант) |
Number.isNaN('text') | false | Сучасний правильний варіант |
Number.isNaN(NaN) | true | Перевірка без приведення типів |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.