Аннотация
Функция isNaN()
определяет является ли литерал или переменная не числовым значением (NaN
) или нет. При работе с функцией необходимо проявлять осторожность так как она работает некорректно. Если вам интересно подробнее можно посмотреть Number.isNaN()
то как она описана в ECMAScript 6, в качестве альтернативного решения можно использовать typeof
для проверки литерала или переменной на не числовое значение.
Синтаксис
isNaN(значение)
Параметры
Значение
- Литерал или переменная которые будут проверятся на не числовое значение.
Описание
Для чего нужна функция isNaN
?
В отличие от других возможных значениях в JavaScript, при работе с значением данного типа невозможно полагаться на == и === для определения, является ли переменная или литерал не числовым значением (NaN
) или нет, так как проверки NaN == NaN
и NaN === NaN
в качестве значения вернут false
. Следовательно, для проверки нужна функция isNaN
.
Примечание:
Для альтернативной проверки переменной на NaN без использования функции isNaN() можно воспользоваться конструкцией x !== x
var x = NaN
x != x // true
x !== x // true
Генерация значения NaN
Значение NaN
генерируются арифметическими операциями, результатом которых является undefined или unrepresentable. Такие условия не обязательно обозначают переполнение стека. NaN
также может являться результатом попытки преобразования числа в строку, или значения, не имеющего эквивалента в простых числовых примитивах.
Например, деление нуля на нуль возвращает NaN
— но деление других чисел на 0 не возвращает NaN.
var x = NaN
x != x // true
x !== x // true
Особенности поведения
С самых ранних версий функции isNaN
её поведение для не числовых переменных или литералов было довольно-таки запутанным. Когда аргументом функции isNaN
является переменная, тип которой не Number, она преобразуется к типу Number
. Полученное значение затем проверяется, является ли оно NaN
. Таким образом для не числовых значений, которые можно преобразовать в числовой тип без не-NaN значения (в частности, пустая строка или логические примитивы, которые преобразуются в 0 или 1), возвращаемое значение "false" может быть полной неожиданностью; пустая строка преобразуется в "not a number." Путаница связана с тем, что "not a number" имеет определённое значение, описанное в стандарте IEEE-794 чисел с плавающей точкой. Функцию стоит воспринимать в качестве ответа на вопрос, "Является ли это значение корректным числом по стандарту IEEE-794?"
В следующей версии ECMAScript (ES6) функция Number.isNaN()
также присутствует. Number.isNaN(x)
будет надёжным методом для проверки, содержит ли x
значение NaN
или нет. Даже с Number.isNaN
, однако, результатом NaN
остаётся точное числовое значение, а не просто "not a number".
Пример
isNaN(NaN); // true isNaN(undefined); // true isNaN({}); // true isNaN(true); // false isNaN(null); // false isNaN(37); // false // strings isNaN("37"); // false: "37" преобразуется в число 37 которое не NaN isNaN("37.37"); // false: "37.37" преобразуется в число 37.37 которое не NaN isNaN(""); // false: пустая строка преобразуется в 0 которое не NaN isNaN(" "); // false: строка с пробелом преобразуется в 0 которое не NaN // Даты isNaN(new Date()); // false isNaN(new Date().toString()); // true // Пример почему использование isNaN не всегда уместно isNaN("blabla") // true: "blabla" преобразованно в число. // При парсинге преобразуется в число при неудаче возвращает NaN
Спецификация
Спецификация | Статус | Комментарий |
---|---|---|
ECMAScript 1st Edition. | Standard | Initial definition. |
ECMAScript 5.1 (ECMA-262) Определение 'isNaN' в этой спецификации. |
Стандарт | |
ECMAScript 2015 (6th Edition, ECMA-262) Определение 'isNaN' в этой спецификации. |
Стандарт |
Поддержка браузерами
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Да) | (Да) | (Да) | (Да) | (Да) |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Да) | (Да) | (Да) | (Да) | (Да) | (Да) |