Введение
NaN — это специальное значение в JavaScript (или во многих языках программирования), которое означает, что значение переменной — Not-a-Number.
NaN — это свойство, доступное в глобальной области (окно в случае выполнения JavaScript в браузере). Хотя присвоение значения NaN переменной или использование NaN в программе никогда не требуется, но NaN существует для обозначения операции или результата синтаксического анализа, который не является числом.
Интересно отметить, что операция typeof над NaN приводит к выводу «числа». Итак,
typeof NaN // «число»
В общем, в JavaScript очень мало операций, которые возвращают NaN. Примеры ниже:
- Разбор или приведение типов к номеру:
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"; }
Спасибо за чтение!