Кратко
Секция статьи "Кратко"Статический метод Number
проверяет переданное аргументом значение и возвращает true
, если это значение NaN
.
Как пишется
Секция статьи "Как пишется"// В этом случае вернет trueNumber.isNaN(NaN)// В остальных случаях всегда falseNumber.isNaN()Number.isNaN(42)Number.isNaN('42')Number.isNaN(null)Number.isNaN(undefined)Number.isNaN(false)
// В этом случае вернет true Number.isNaN(NaN) // В остальных случаях всегда false Number.isNaN() Number.isNaN(42) Number.isNaN('42') Number.isNaN(null) Number.isNaN(undefined) Number.isNaN(false)
Как это понять
Секция статьи "Как это понять"Существуют ситуации, когда результат математической обработки не может быть получен. Например, Math
или parseInt
. Результатом выполнения в таком случае будет 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
.
Есть так же глобальная функция isNaN
, но она работает не всегда так, как ожидается и возвращает true
и при значениях, отличных от NaN
. Например:
isNaN(undefined)// trueNumber.isNaN(undefined)// false
isNaN(undefined) // true Number.isNaN(undefined) // false
Сравнение isNaN()
и Number.isNaN()
Секция статьи "Сравнение isNaN() и Number.isNaN()" Отличие заключается в том, что глобальная функция isNaN
приводит к числовому типу всё, что было в неё передано, если оно не является числом. Если в результате приведения был получен 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
, то isNaN
вернёт true
, приняв пустое значение за NaN
.
Number()// 0isNaN()// true
Number() // 0 isNaN() // true
Number
же никаких приведений не производит. Она вернёт true
только если переданное в неё значение является NaN
.
На практике
Секция статьи "На практике"🛠 При анализе ввода пользователя всегда нужно проверять результаты вычислений, иначе пользователь вместо расчёта — например «Итого» в корзине увидит непонятные для себя символы. Вот, к примеру, очень приятная цена ✈️
Попробуй имитировать ошибку и ввести в поле что-то помимо числа скидки, без проверки тоже получится NaN
: