Коротка відповідь
juniorisNaN() — глобальна функція, що конвертує аргумент у число перед перевіркою; Number.isNaN() — метод, що не конвертує і повертає true лише для значення типу number, яке є NaN.
Повне пояснення
Що це і навіщо
isNaN()використовується для визначення, чи є значення «не число» після автоматичної конвертації типу.Number.isNaN()застосовується, коли потрібна сувора перевірка типу number без конвертації.
Ключові принципи/терміни
NaN(Not a Number) – спеціальний числовий тип, що означає «невизначене число».- Конвертація типу:
Number(value)або+value.
Як це працює
isNaN(value)виконуєNumber(value); якщо результат — NaN, повертається true.Number.isNaN(value)просто перевіряє:(typeof value === 'number' && isNaN(value)).
Практика і реалізація
console.log(isNaN('foo')); // true – 'foo' → NaN
console.log(Number.isNaN('foo')); // false – тип string
Тестування
import { test, expect } from 'vitest';
test('isNaN vs Number.isNaN', () => {
expect(isNaN('bar')).toBe(true);
expect(Number.isNaN('bar')).toBe(false);
});
Особливості в контексті JS Core
isNaN()часто використовується у старих кодах, але може призвести до помилок через неочікувану конвертацію.Number.isNaN()рекомендовано у сучасних проектах, де потрібна типова перевірка.
Оптимізація та edge cases
isNaN(undefined)→ true, боNumber(undefined)= NaN.Number.isNaN(undefined)→ false, бо тип не number.- Для перевірки «не число» без конвертації можна використовувати
Number.isNaN(value)абоObject.is(value, NaN).
Часті помилки
- Очікування, що
isNaN('123')поверне false – насправді true. - Відсутність конвертації у
Number.isNaN()→ false для string. - Використання
isNaNу колекціях, де значення можуть бути об’єктами. - Не розуміння різниці між
NaNіundefined. - Перевірка типу через
typeof value === 'number' && isNaN(value)замість вбудованого методу. - Застосування
isNaNу функціях, що приймають лише числа. - Необхідність перевірки
Number.isFinite()для уникнення Infinity. - Використання
isNaNу бібліотеках, що працюють з BigInt – повертає false.
Cheatsheet
isNaN(x)→ конвертує, повертає true для NaN.Number.isNaN(x)→ без конвертації, true лише для number‑типу NaN.Object.is(x, NaN)→ ще один спосіб суворої перевірки.
Follow‑up питання
- Які інші глобальні функції мають схожу поведінку щодо конвертації?
- Як працює
Number.isFinite()у порівнянні зisFinite()?