Введение

NaN — это специальное значение в JavaScript (или во многих языках программирования), которое означает, что значение переменной — Not-a-Number.

NaN — это свойство, доступное в глобальной области (окно в случае выполнения JavaScript в браузере). Хотя присвоение значения NaN переменной или использование NaN в программе никогда не требуется, но NaN существует для обозначения операции или результата синтаксического анализа, который не является числом.

Интересно отметить, что операция typeof над NaN приводит к выводу «числа». Итак,
typeof NaN // «число»

В общем, в JavaScript очень мало операций, которые возвращают NaN. Примеры ниже:

  1. Разбор или приведение типов к номеру:
const num = parseInt("xyz") //NaN
const num2 = Number("xyz") //NaN
const num3 = +"xyz" //NaN

2. Любая математическая операция над строковым значением, кроме +. (+ перегружен, а «str» + Number объединится и вернет строку).

"xyz" / 3  //NaN
"xyz" * 4 //NaN

3. Математическая операция, результат которой не является действительным или неопределенным числом.

0 * Infinity //NaN
Math.sqrt(-10) //NaN
NaN + 7 //NaN

Особым свойством NaN является то, что NaN никогда не равен никакому другому значению, включая само себя.

NaN === NaN //false
NaN !== NaN // true

Как проверить NaN?

Доступны две функции: JavaScript для проверки значений NaN.

IsNaN() доступен как глобальный объект (окно)

Число.isNaN()

Две функции проверяют значения NaN, но имеют заметно разное поведение и приводят к разным результатам в крайних случаях.

Global isNaN() пытается преобразовать входные данные в число, а затем проверяет, является ли результат NaN.

isNaN(5) // false
isNaN("") //false as empty string is convertible to 0
isNaN(false) // false
isNaN(NaN) //true
isNaN("xyz") // true, as result of Number("xyz") is NaN
isNaN(null) //false as null is convertible to number 0.
isNaN(undefined) //true as Number(undefined) is NaN
isNaN("123") // false

Итак, если мы хотим написать полифилл для глобального isNaN, мы можем написать ниже

function isNaN(input) {
  const convertedNumber = Number(input)
  //because NaN is never equal to NaN
  return convertedNumber !== convertedNumber;
}

Алгоритм Number.isNaN() немного отличается от глобального IsNaN(). Number.isNaN() проверяет тип и, если тип не «число», возвращает false. Если тип аргумента «число», то он проверяет, является ли значение NaN или нет.

Number.isNaN(5) // false
Number.isNaN("") //false as typeof "" != "number"
Number.isNaN(false) // false
Number.isNaN(NaN) //true
Number.isNaN("xyz") // false, isNaN("xyz") returns true here
Number.isNaN(null) //false
Number.isNaN(undefined)// false, isNaN(undefined) returns true here
Number.isNaN("123") // false as type of "123" is "string"

Давайте посмотрим на полифилл для Number.isNaN().

function isNaN(input) {
  return input!== input  and typeof input === "number";
}

Спасибо за чтение!