Кратко
СкопированоСтатический метод Number проверяет переданное аргументом значение и возвращает true, если это значение NaN.
Как пишется
Скопировано
Number.isNaN(NaN)// trueNumber.isNaN()Number.isNaN(42)Number.isNaN('42')Number.isNaN(null)Number.isNaN(undefined)Number.isNaN(false)// false
Number.isNaN(NaN)
// true
Number.isNaN()
Number.isNaN(42)
Number.isNaN('42')
Number.isNaN(null)
Number.isNaN(undefined)
Number.isNaN(false)
// false
Как понять
СкопированоСуществуют ситуации, когда результат математической обработки не может быть получен. Например, Math или parse. Результатом выполнения в таком случае будет NaN. NaN расшифровывается как Not a Number, то есть «не число». При этом он относится к числовому типу данных.
typeof NaN// 'number'
typeof NaN
// 'number'
Сравнение NaN с чем угодно, даже с самим собой, вернёт false. Так что проверка результатов математических операций стандартным способом не принесёт успеха. В примере ниже валидация введённых пользователем данных не будет работать.
function getUserAge() { while (true) { const value = prompt('Пожалуйста, укажите ваш возраст') if (!value) { alert('Вы ничего не ввели!') continue } return Number(value) }}const age = getUserAge()if (age === NaN) { alert('Вы ввели неверные данные') // Не сработает}
function getUserAge() {
while (true) {
const value = prompt('Пожалуйста, укажите ваш возраст')
if (!value) {
alert('Вы ничего не ввели!')
continue
}
return Number(value)
}
}
const age = getUserAge()
if (age === NaN) {
alert('Вы ввели неверные данные')
// Не сработает
}
Мы бы могли использовать уникальные свойства NaN и написать собственную утилиту для проверки результата, сравнивая его с самим собой.
function isNaN(number) { return number !== number}const age = getUserAge()if (isNaN(age)) { alert('Вы ввели неверные данные') // Теперь будет работать}
function isNaN(number) {
return number !== number
}
const age = getUserAge()
if (isNaN(age)) {
alert('Вы ввели неверные данные')
// Теперь будет работать
}
Однако мы не рекомендуем использовать такой подход в разработке. Для проверки лучше применять статический метод Number у обёртки Number.
Есть так же глобальная функция is, но она работает не всегда так, как ожидается, и возвращает true и при значениях, отличных от NaN. Например:
isNaN(undefined)// trueNumber.isNaN(undefined)// false
isNaN(undefined)
// true
Number.isNaN(undefined)
// false
Сравнение isNaN() и Number.isNaN()
СкопированоОтличие заключается в том, что глобальная функция is приводит к числовому типу всё, что было в неё передано, если оно не является числом. Если в результате приведения был получен NaN, она возвращает true:
Number(undefined)// NaNisNaN(undefined)// trueNumber('0')// 0isNaN('0')// false
Number(undefined)
// NaN
isNaN(undefined)
// true
Number('0')
// 0
isNaN('0')
// false
Однако, если неявная передача undefined (вызов функции без параметров) в Number возвращает число 0, то is вернёт true, приняв пустое значение за NaN.
Number()// 0isNaN()// true
Number()
// 0
isNaN()
// true
Number же никаких приведений не производит. Она вернёт true только если переданное в неё значение является NaN.
На практике
Скопированосоветует
Скопировано🛠 При анализе того, что ввёл пользователь, всегда проверяйте результаты вычислений. В противном случае пользователь вместо расчёта, например, «Итого», увидит в корзине непонятные символы. Вот, к примеру, очень приятная цена ✈️

Попробуйте сымитировать ошибку и ввести в поле что-то помимо числа скидки: без проверки тоже получится NaN: