Просто из любопытства.
Это не кажется очень логичным, что typeof NaN
число. Прямо как NaN === NaN
или NaN == NaN
возвращение ложного, кстати. Это одна из особенностей javascript, или была бы причина для этого?
Изменить: спасибо за ваши ответы. Это не легкая вещь, чтобы заставить их голову вокруг все же. Читая ответы и вики я понял больше, но все же предложение вроде
Сравнение с NaN всегда возвращает неупорядоченный результат даже при сравнении с самим собой. Предикаты сравнения являются либо сигнальными, либо не сигнальными, версии сигнализации сигнализируют недопустимое исключение для таких сравнений. Предикаты равенства и неравенства не сигнализируют, поэтому x = x, возвращающий false, можно использовать для проверки, является ли x спокойным NaN.
Просто у меня голова кружится. Если бы кто-то смог перевести это на понятный человеку (в отличие от, скажем, математика) язык, я был бы благодарен.
источник
isNumeric
проверять тип:$.isNumeric(NaN);
возвращает false, где as$.type(NaN);
возвращает номер. api.jquery.com/jQuery.isNumericОтветы:
Это не число. Это не особенность javascript, а общий принцип информатики.
С http://en.wikipedia.org/wiki/NaN :
Все эти значения могут не совпадать. Простой тест для NaN - это проверка
value == value
на ложность.источник
isNaN(value)
isNaN(undefined)
возвращаетсяtrue
, ноundefined == undefined
тоже верно. То же самое касается всех других нечисловых типов, кромеnull
.value !== value
это, вероятно, самый короткий способ проверить,value
действительно ли это такNaN
.Ну,
NaN
это все еще числовой тип , несмотря на то, что на самом деле он обозначает Not-A-Number :-)NaN
просто означает, что конкретное значение не может быть представлено в пределах ограничений числового типа (хотя это можно сказать для всех чисел, которые должны быть округлены, чтобы соответствовать, ноNaN
это особый случай).Определенное
NaN
не считается равным другому,NaN
поскольку они могут иметь разные значения. Тем не менее,NaN
это все еще числовой тип, как 2718 или 31415.Что касается вашего обновленного вопроса, чтобы объяснить в терминах непрофессионала:
Все это означает (разбито на части):
По сути, a
NaN
не равно любому другому числу, включая другоеNaN
, и даже включая себя .Попытка выполнить операции сравнения (меньше, больше, и т. Д.) Между
NaN
числом a и другим может привести к тому, что будет сгенерировано исключение (сигнализация) или просто получится ложное в результате (не сигнализация или тишина).Тесты на равенство (равно, не равно) никогда не сигнализируют, поэтому их использование не вызовет исключения. Если у вас есть обычный номер
x
, тоx == x
всегда будет верно. Еслиx
естьNaN
, тоx == x
всегда будет ложным. Это дает вам возможностьNaN
легко обнаружить (тихо).источник
typeof a === 'number'
означает, что «хранится внутри как IEEE 754 float»Infinity === Infinity
возвращается,true
если anInfinity
может быть получено с разными значениями: 1.0 / 0.0 или 2.0 / 0.0?1/0
и2/0
лежу в одном классе и (2) в IEEE754 есть только один класс бесконечности (кроме,+/-
конечно,).0/0
не определены каким-либо осмысленным образом, за исключением того, что его «значением» является весь набор чисел. И даже если они были определены,Math.log(-1) == Math.log(-1)
все равно оцениваетсяfalse
. Таким образом, не только не существует «фактических чисел»,NaN
но даже если они были, они не использовались для сравнения.Стандарт ECMAScript (JavaScript) указывает, что
Numbers
это IEEE 754 с плавающей точкой, которые включаютNaN
в качестве возможного значения.источник
typeof NaN
возвращается,'number'
потому что:Спецификация ECMAScript говорит, что тип Number включает NaN:
Так что
typeof
возвращается соответственно:Это поведение соответствует стандарту IEEE для арифметики с плавающей точкой (IEEE 754) :
источник
NaN является допустимым значением с плавающей запятой ( http://en.wikipedia.org/wiki/NaN )
и NaN === NaN ложно, потому что они не обязательно одинаковы
источник
Infinity
как-то идентичны? Есть предположения?NaN != NaN
потому что они не нужны ЖЕ не номер. Таким образом, это имеет большой смысл ... Кроме того, почему числа с плавающей точкой имеют +0,00 и -0,00, которые не совпадают. Округление может сделать то, что они на самом деле не равны нулю.Что касается typeof, это зависит от языка. И большинство языков скажут, что NaN - это число с плавающей запятой, двойное число или число, в зависимости от того, как они его классифицируют ... Я не знаю языков, которые бы говорили, что это неизвестный тип или нуль.
источник
number
,NaN
является примитивным, и, следовательно, однозначно определяется его значением.NaN
обозначает не число . Это значение числовых типов данных (обычно типов с плавающей запятой, но не всегда), которое представляет результат недопустимой операции, такой как деление на ноль.Хотя его имена говорят, что это не число, тип данных, используемый для его хранения, является числовым типом. Таким образом, в JavaScript запрос типа данных
NaN
вернетсяnumber
(какalert(typeof(NaN))
наглядно демонстрирует).источник
Infinity
нетNaN
Javascript использует NaN для представления всего, с чем он сталкивается, что не может быть представлено другими способами в его спецификациях. Это не значит, что это не число. Это просто самый простой способ описать встречу. NaN означает, что он или объект, который ссылается на него, не может быть представлен каким-либо другим способом с помощью javascript. Для всех практических целей, это «неизвестно». Будучи «неизвестным», он не может сказать вам, что это такое, даже если оно само по себе. Это даже не объект, которому он назначен. Он может только сказать вам, что это не так, а не-ничто или ничто можно описать математически только на языке программирования. Поскольку математика о числах, javascript представляет ничто как NaN. Это не значит, что это не число. Это означает, что мы не можем прочитать это любым другим способом, который имеет смысл. Вот почему это может т даже равен себе. Потому что это не так.
источник
Лучшее название
NaN
, описывающее его значение более точно и менее запутанно, будет числовым исключением . Это действительно другой тип объекта исключения, замаскированный как имеющий примитивный тип (в соответствии с языковым дизайном), где в то же время он не рассматривается как примитивный в своем ложном самосравнении. Откуда путаница. И до тех пор, пока язык «не решится» выбирать между правильным объектом исключения и примитивной цифрой , путаница останется.Печально известное неравенство между
NaN
собой и тем==
и другим===
является проявлением запутанного замысла, заставляющего этот объект исключения становиться примитивным типом. Это нарушает фундаментальный принцип, согласно которому примитив однозначно определяется его ценностью . ЕслиNaN
предпочтительнее рассматривать его как исключение (из которых могут быть разные виды), то его не следует «продавать» как примитив. И если он хочет быть примитивным, этот принцип должен соблюдаться. Пока он сломан, как у нас в JavaScript, и мы не можем на самом деле выбрать между ними, путаница, приводящая к ненужной когнитивной нагрузке для всех участников, останется. Что, однако, действительно легко исправить, просто сделав выбор между двумя:NaN
специальный объект исключения, содержащий полезную информацию о том, как возникло исключение, а не выбрасывать эту информацию как то, что в настоящее время реализовано, что приводит к сложному для отладки коду;NaN
объект примитивного типаnumber
(который можно было бы назвать менее численным) «в числовом виде», в этом случае он должен быть равен самому себе и не может содержать никакой другой информации; последнее явно является худшим выбором.Единственное мыслимое преимущество принудительного ввода
NaN
вnumber
тип - это возможность вернуть его в любое числовое выражение. Что, однако, делает его хрупким выбором, потому что результат любого содержащего числовое выражениеNaN
будет либо иметьNaN
, либо приводить к непредсказуемым результатам, таким какNaN < 0
оценкаfalse
, т.е. возвратboolean
вместо сохранения исключения.И даже если «все так, как есть», ничто не мешает нам сделать это четкое различие для себя, чтобы сделать наш код более предсказуемым и легче отлаживаемым. На практике это означает выявление этих исключений и рассмотрение их как исключений. Что, к сожалению, означает больше кода, но, надеюсь, будет смягчено такими инструментами, как TypeScript of Flowtype.
И затем у нас есть грязное тихое против шумного ака сигнального
NaN
различия . Что на самом деле касается того, как обрабатываются исключения, а не самих исключений, и ничем не отличается от других исключений.Аналогично,
Infinity
и+Infinity
являются элементами числового типа, возникающими в расширении реальной строки, но они не являются действительными числами. Математически они могут быть представлены последовательностями действительных чисел, сходящихся к одному+
или-Infinity
.источник
Это просто потому, что
NaN
это свойство объекта Number в JS. Оно не имеет ничего общего с тем, что оно является числом.источник
Number.fu = "bar"; alert(typeof Number.fu);
NaN
не является значением, хранящимся в немNumber.NaN
, каким бы оно ни было.NaN
является примитивным значением типа Number. И, кроме того, значениеNumber.NaN
естьNaN
, но это не связано.Лучший способ думать о NAN - то, что это не известное число. Вот почему NAN! = NAN, потому что каждое значение NAN представляет какое-то уникальное неизвестное число. NAN необходимы, потому что числа с плавающей запятой имеют ограниченный диапазон значений. В некоторых случаях происходит округление, когда младшие биты теряются, что приводит к тому, что кажется бессмысленным, например, 1,0 / 11 * 11! = 1,0. Действительно большие значения, которые больше, являются NAN с бесконечностью, являющейся прекрасным примером.
Учитывая, что у нас всего десять пальцев, любая попытка показать значения больше 10 невозможна, что означает, что такие значения должны быть NAN, потому что мы потеряли истинное значение этого значения больше 10. То же самое верно для значений с плавающей запятой, где значение превышает пределы того, что может храниться в плавающей запятой.
источник
Потому что NaN - это числовой тип данных.
источник
NaN
является числом с точки зрения типа, но не является нормальным числом, таким как 1, 2 или 329131. Имя «Не число» относится к тому факту, что представленное значение является специальным и относится к области спецификации формата IEEE, а не к домен языка javascript.источник
Если вы используете jQuery, я предпочитаю
isNumeric
проверять тип:http://api.jquery.com/jQuery.isNumeric/
источник
isNumber
изutil
пакета машинописи. Хорошо, что мы все еще используемjQuery
в нашем проекте, поэтому использовал ваше предложение вместо этого.isNumber
изutil
машинописи также возвращаетtrue
дляNaN
.Javascript имеет только один числовой тип данных, который является стандартным 64-битным плавающим с двойной точностью. Все двойное. NaN - это особое значение double, но, тем не менее, это double.
Все, что
parseInt
нужно, это «привести» вашу строку к числовому типу данных, так что результатом всегда будет «число»; только если исходная строка не может быть проанализирована, ее значение будет NaN.источник
NaN по-прежнему числовой тип, но он представляет значение, которое не может представлять допустимое число.
источник
Мы можем утверждать, что NaN является объектом особого случая. В этом случае объект NaN представляет число, которое не имеет математического смысла. В математике есть и другие особые объекты, такие как INFINITE и так далее.
Вы все еще можете сделать некоторые вычисления с ним, но это приведет к странному поведению.
Более подробная информация здесь: http://www.concentric.net/~ttwang/tech/javafloat.htm (на основе Java, а не на JavaScript)
источник
Вы должны любить Javascript. У этого есть некоторые интересные маленькие причуды.
http://wtfjs.com/page/13
Большинство из этих причуд можно объяснить, если вы перестанете их логически решать или если вы немного знакомы с теорией чисел, но тем не менее они могут вас поймать, если вы о них не знаете.
Между прочим, я рекомендую прочитать остальную часть http://wtfjs.com/ - есть намного более интересные причуды, чем этот, чтобы быть найденным!
источник
Значение NaN - это действительно Number.NaN, поэтому, когда вы спросите, является ли это число, он скажет «да». Вы сделали правильную вещь, используя вызов isNaN ().
Для информации, NaN также может быть возвращен операциями с числами, которые не определены как деления на ноль или квадратный корень из отрицательного числа.
источник
NaN == Number.NaN
оценивает доfalse
!NaN==NaN
существоfalse
, должно быть , это был садист, который изобрел это, чтобы заставить всех страдать.Пример
Представьте, что мы конвертируем строку в число:
Мы изменили тип данных на число, но его значение не является числом!
источник
NaN
имеет тип номера . Вопрос в том, почему.Это специальное значение типа Number как POSITIVE_INFINITY
Зачем? По дизайну
источник