mozilla
Your Search Results

    isNaN

    This article is in need of a technical review.

    Аннотация

    Функция 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 6 (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 (Да) (Да) (Да) (Да) (Да) (Да)

    См. также

    Метки документа и участники

    Contributors to this page: Sheppy, Troynov, fscholz, SphinxKnight, torbasow, teoli, Dionys
    Обновлялась последний раз: torbasow,
    Скрыть боковую панель