Nan js что это
Перейти к содержимому

Nan js что это

  • автор:

Значение NaN

Значение NaN (сокращение от Not-A-Number) обозначает «не число». Такое значение возникает при попытках сделать недопустимую математическую операцию.

Пример

Давайте умножим строку с буквами на число:

console.log(‘aaa’ * 3);

Результат выполнения кода:

Пример

Давайте попробуем разделить одну строку на другую:

console.log(‘aaa’ / ‘bbb’);

После выполнения кода мы также получим NaN :

Пример

Теперь давайте суммируем значение NaN с числом:

console.log(NaN + 3);

Результат выполнения кода:

Смотрите также

  • функцию isNaN ,
    которая осуществляет проверку на NaN

NaN это не «не число»

При разработке программного обеспечения очень важно быть точным в использовании терминов: корректное использование необходимо для эффективной коммуникации между разработчиками. Очень важно быть на одной волне.

Один из терминов, который очень часто используют неправильно,— это NaN .

Его корни лежат в стандарте IEEE754, он определяет NaN как специальное значение (на самом деле, как мы увидим далее, множество значений), которое используется если результат вычисления не может или не должен быть представлен как конкретное число, или попросту неизвестен. Например: asin(2) или 0/0. Это приводит нас к следующему открытию: NaN — на самом деле значение числового типа! Просто это специальное число, которое представлено по-особенному.

Итак, NaN , согласно стандарту IEEE754, не какое-то значение не числового типа, но в действительности — число. А это значит, что не совсем корректно говорить, что строка «foo» является NaN , ибо на самом деле это не так.

Всё становится ещё более интересным если мы посмотрим, как значение NaN представлено внутри. У чисел с плавающей запятой двойной точности (64 бит), которые используются для представления значений типа Number в JavaScript и некоторых других языках, специальный диапазон значений, у которых экспонента равна значению 0x7FF (11 бит), выделен для представления числа NaN . А это значит, что оставшиеся 53 бита могут принимать произвольные значения (исключая значения с мантиссой равной нулю, ибо эти значения зарезервированы для двух других специальных значений: +Infinity и -Infinity ). Итого, для чисел с плавающей запятой двойной точности мы можем сконструировать значение NaN 9007199254740990 (2^53 — 3) разными способами. Это довольно-таки много.

Подводя итог: если вы используете термин NaN как синоним, обозначающий «что угодно, что не является числом» (строка, значение null , объект, и т.д.), пожалуйста, прекратите. А если вы уже знаете что к чему, то расскажите об этом остальным, что бы они могли выражать свои мысли так же точно, как это делаете вы.

Материалы для дальнейшего изучения:

  • http://www.binaryconvert.com/ — калькулятор, который позволяет конвертировать числа разных форматов в бинарное представление и обратно
  • Число с плавающей точкой стандарта IEEE
  • Формат чисел с плавающей запятой одинарной точности
  • Формат чисел с плавающей запятой двойной точности

© 2013 Frontender Magazine

Кроме материалов, опубликованных под лицензией Creative Commons

JavaScript: NaN

Некоторые операции с бесконечностями приводят к странному результату, например, деление бесконечности на бесконечность. В математике такая операция не имеет никакого числового эквивалента. В JavaScript вернется NaN .

Infinity / Infinity; // NaN 

NaN — специальное значение «не число», которое обычно говорит о том, что была выполнена бессмысленная операция. Результатом практически любой операции, в которой участвует NaN , будет NaN .

NaN + 1; // NaN 

NaN интересное значение, хотя оно обозначает «не число» — с точки зрения типов, оно является числом. Парадокс. NaN никогда не является желаемым значением и появляется только в результате ошибок. Если вы его встретили, то нужно отследить момент, в котором выполнилась операция, недопустимая для чисел, и поправить это место.

Задание

Выполните операцию, которая приводит к NaN, и распечатайте её результат на экран с помощью console.log() .

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

isNaN

Функция 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("37,5"); // true // Даты isNaN(new Date()); // false isNaN(new Date().toString()); // true // Пример почему использование isNaN не всегда уместно isNaN("blabla"); // true: "blabla" преобразовано в число. // При парсинге преобразуется в число при неудаче возвращает NaN 

Спецификация

Specification
ECMAScript Language Specification
# sec-isnan-number

Совместимость с браузерами

BCD tables only load in the browser

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *