Статья была первоначально размещена на моем Личный блог Анкет
Я недавно ответил на интересный Вопрос На переполнении стека о типе НАН Анкет
это то, что происходит
TypeOf number.parseInt ('обработка') Отпечатки 'номер' Анкет
Но если Number.parseint ('обработан') дает НАН Анкет
И действительно, если вы вводите консоль своего браузера Тип Нэн Вы получите правду. Комментарии к ответу заставили меня понять, что это не еще один из причудливых изделий JavaScript, но на самом деле стандартная функция всех языков программирования, которые реализуют Стандарт IEEE для арифметики с плавающей точкой (IEEE 754).
В Руби, например, НАН может быть либо экземпляр Плавать или BigDecimal Анкет
И действительно, если мы посмотрим на ECMA-262, 10-е издание , спецификация языка Ecmascript, Раздел 4.3.21 утверждает, что тип числа представляет собой «набор всех возможных значений числа, включая специальное значение« не номера »(NAN), положительную бесконечность и отрицательную бесконечность». Несколько подразделений ниже, Раздел 4.3.24 Укаживает, что NAN-это «число числового значения, которое является IEEE 754-2008« не номера «значения».
Так Что это за стандарт IEEE 754?
Впервые опубликованные в 1985 году, его основная цель – предоставить вычислительный метод с номерами с плавающими точками, который будет иметь одинаковые результаты, независимые от среды, в которой выполняется обработка, будь то программное обеспечение, оборудование или сочетание обоих. Вместе с указанием форматов и методов для арифметики с плавающей точкой в средах компьютерного программирования IEEE 754 также определяет набор специальных значений: 0 ( -0 и +0 являются различными значениями, хотя они оба равны; Вот Глубокая статья о обоих нулевых значениях в JS), денормализованный номер , положительный и отрицательный Бесконечность и НАН , который стандарт описывает как числовой тип данных, который не может быть представлен в вычислительной системе. Фактически, IEEE 754 определяет два типа НАН -тихо НАН ( qnan ) и сигнализация НАН ( snan ). Наиболее важное различие между ними заключается в том, что snan вызовет исключение при использовании в арифметических операциях и qnan не будет. Кажется, что в JavaScript все НАН S тихи, по крайней мере, я не смог найти какую -либо информацию наоборот.
Кроме того, стандарт определяет интересный список специальных операций и их результатов:
number ÷ Infinity = 0 number ÷ -Infinity = -0 ±Infinity × ±Infinity = ±Infinity ±non zero number ÷ ±0 = ±Infinity number × ±Infinity = ±Infinity Infinity + Infinity = ±Infinity Infinity – -Infinity = +Infinity -Infinity – Infinity = Infinity -Infinity + – Infinity = Infinity ±0 ÷ ±0 = NaN ±Infinity ÷ ±Infinity = NaN ±Infinity × 0 = NaN NaN == NaN (also '===' in JS) //False
Тестирование на значения NAN
JavaScript нет ни одного НАН Значение, на самом деле, согласно ECMA-262 , Существует «9007199254740990 (то есть 253-2) различные« не номера »значений IEEE стандарта […], представленных в ECMASCRIPT в виде единого специального значения NAN. В некоторых реализациях внешний код может обнаружить разницу между различными, не нуберными значениями, но такое поведение зависит от реализации; Для кода Ecmascript все значения NAN неотличимы друг от друга ».
Потому что НАН Не равновесно (и на самом деле на некоторых языках программирования самопоценка является широко используемым подходом для проверки для nan s), нам нужно использовать специальное Number.isnan () или Isnan () Методы обнаружения НАН является. Разница между ними заключается в том, что isnan () Возвращает истинный Если значение в настоящее время НАН или Это будет НАН после его принуждения к числовой ценности и Number.isnan () Только вернется истинный Если значение в настоящее время НАН Анкет Вообще Number.isnan () более точный, так как он также проверяет, является ли тип значения числом. Mdn имеет удобное объяснение тестирования против Нэн.
Наличие значения «не число» для того, чтобы быть типом числа, довольно нелогично, возможно, лучшим именем было бы «не реальным числом» или что -то в этом роде. В этом случае, однако, это не странное поведение в JavaScript, а общий принцип программирования.
Есть какие -либо вопросы/комментарии или другие виды отзывов об этом посте? Дайте мне знать здесь, в комментариях или по адресу Twitter Анкет
Оригинал: “https://dev.to/clarity89/what-is-the-type-of-nan-815”