Клавиша / esc

Number.isNaN()

Проверяет, а не NaN ли нам прислали.

Время чтения: меньше 5 мин

Кратко

Скопировано

Статический метод Number.isNaN() проверяет переданное аргументом значение и возвращает 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.sqrt(-9) или parseInt('text'). Результатом выполнения в таком случае будет 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.isNaN() у обёртки Number.

Есть так же глобальная функция isNaN(), но она работает не всегда так, как ожидается, и возвращает true и при значениях, отличных от NaN. Например:

        
          
          isNaN(undefined)// trueNumber.isNaN(undefined)// false
          isNaN(undefined)
// true

Number.isNaN(undefined)
// false

        
        
          
        
      

Сравнение 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.isNaN() же никаких приведений не производит. Она вернёт true только если переданное в неё значение является NaN.

На практике

Скопировано

Николай Лопин советует

Скопировано

🛠 При анализе того, что ввёл пользователь, всегда проверяйте результаты вычислений. В противном случае пользователь вместо расчёта, например, «Итого», увидит в корзине непонятные символы. Вот, к примеру, очень приятная цена ✈️

NaN цена за билет

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

Открыть демо в новой вкладке