Кратко
СкопированоСтатический метод 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
: