为什么typeNNN会返回"数字"?

Koo*_*Inc 153 javascript nan

只是出于好奇.

typeof NaN数字似乎不合逻辑.顺便说一句,就像NaN === NaNNaN == NaN返回虚假一样.这是javascript的特点之一,还是有理由这样做?

编辑:谢谢你的回答.尽管让人们感到高兴并不容易.阅读答案和维基我理解得更多,但仍然是一句话

与NaN进行比较时,即使与自身进行比较,也会返回无序结果.比较谓词是信令或非信令,信令版本表示这种比较的无效例外.等式和不等式谓词是非信令的,因此x = x返回false可用于测试x是否是安静的NaN.

只是让我头晕目眩.如果有人能用人类(而不是数学家)的可读语言翻译,我会感激不尽.

pax*_*blo 99

好吧,NaN仍然是一个数字类型,尽管它实际上代表Not-A-Number :-)

NaN只是意味着特定值不能在数字类型的限制内表示(尽管可以说所有必须舍入的数字都适合,但这NaN是一种特殊情况).

具体NaN不被认为与另一个相同,NaN因为它们可能是不同的值.但是,NaN仍然是数字类型,就像2718或31415一样.


至于您更新的问题,以外行的方式解释:

与NaN进行比较时,即使与自身进行比较,也会返回无序结果.比较谓词是信令或非信令,信令版本表示这种比较的无效例外.等式和不等式谓词是非信令的,因此x = x返回false可用于测试x是否是安静的NaN.

所有这些意味着(分解为部分):

与NaN进行比较时,即使与自身进行比较,也会返回无序结果.

基本上,a NaN不等于任何其他数字,包括另一个NaN,甚至包括其自身.

比较谓词是信令或非信令,信令版本表示这种比较的无效例外.

试图在a NaN和另一个数字之间进行比较(小于,大于等)操作可能导致抛出异常(信令)或者仅仅导致结果为假(非信令或安静).

等式和不等式谓词是非信令的,因此x = x返回false可用于测试x是否是安静的NaN.

相等(等于,不等于)的测试从不发出信号,因此使用它们不会导致异常.如果你有一个常规号码x,那么x == x将永远是真的.如果x是a NaN,则x == x永远是假的.它为您提供了一种NaN轻松(安静)检测的方法.

  • +1 - 所以数字不是数字.优秀 ;) (11认同)
  • 很好的解释,尽管我不同意最后两句话:检查 x 是否为 NaN 的更好方法是使用 isNaN() 函数 (5认同)

Cha*_*tie 49

这意味着不是数字.它不是javascript的特性,而是普通的计算机科学原理.

来自http://en.wikipedia.org/wiki/NaN:

返回NaN有三种操作:

使用NaN作为至少一个操作数的操作

不确定的形式

  • 划分0/0,∞/∞,∞/-∞,-∞/∞和-∞/-∞
  • 乘法0×∞和0×-∞
  • 功率1 ^∞
  • 加法∞+( - ∞),( - ∞)+∞和等价减法.

具有复杂结果的实际操作:

  • 负数的平方根
  • 负数的对数
  • 90度(或π/ 2弧度)的奇数倍的切线
  • 数字的反正弦或余弦小于-1或大于+1.

所有这些值可能不一样.对NaN的简单测试是测试value == value是错误的.

  • 更简单的测试是`isNaN(value)` (45认同)
  • 换句话说,`value!== value`可能是测试`value`是否真正是'NaN`的最短方法. (5认同)
  • @Alsciende虽然不相同.`isNaN(undefined)`返回`true`,但`undefined == undefined`也是如此.除了`null`之外的所有其他非数字类型也是如此. (4认同)
  • 短语“这些值可能不相同”没有意义,因为这些值不存在。 (3认同)

小智 17

ECMAScript的(JavaScript的)标准规定,NumbersIEEE 754浮筒,其中包括NaN作为可能的值.

ECMA 262 5e第4.3.19节:数值

原始值对应于双精度64位二进制格式IEEE 754值.

ECMA 262 5e第4.3.23节:NaN

数值是IEEE 754"非数字"值.

维基百科上的IEEE 754

IEEE浮点运算标准是由电气和电子工程师协会建立的技术标准,也是最广泛使用的浮点运算标准[...]

标准定义

  • 算术格式:二进制和十进制浮点数据集,由有限数(包括带符号的零和次正规数),无穷大和特殊的"非数字"值(NaN)组成

[...]


Ori*_*iol 7

typeof NaN返回'number'因为:

  • ECMAScript规范说数字类型包括NaN:

    4.3.20号码类型

    所有可能的数值的集合,包括特殊的"非数字"(NaN)值,正无穷大和负无穷大

  • 因此typeof返回:

    11.4.3运营商的类型

    生产UnaryExpression:typeof UnaryExpression的计算方法如下:

    1. val是评估UnaryExpression的结果.
    2. 如果Type(val)是Reference,那么
      1. 如果IsUnresolvableReference(val)为true,则返回"undefined".
      2. valGetValue(val).
    3. 返回由确定的字符串类别(VAL根据表20).

                    Table 20 — typeof Operator Results
    ==================================================================
    |        Type of val         |              Result               |
    ==================================================================
    | Undefined                  | "undefined"                       |
    |----------------------------------------------------------------|
    | Null                       | "object"                          |
    |----------------------------------------------------------------|
    | Boolean                    | "boolean"                         |
    |----------------------------------------------------------------|
    | Number                     | "number"                          |
    |----------------------------------------------------------------|
    | String                     | "string"                          |
    |----------------------------------------------------------------|
    | Object (native and does    | "object"                          |
    | not implement [[Call]])    |                                   |
    |----------------------------------------------------------------|
    | Object (native or host and | "function"                        |
    | does implement [[Call]])   |                                   |
    |----------------------------------------------------------------|
    | Object (host and does not  | Implementation-defined except may |
    | implement [[Call]])        | not be "undefined", "boolean",    |
    |                            | "number", or "string".            |
    ------------------------------------------------------------------
    
    Run Code Online (Sandbox Code Playgroud)

此行为符合IEEE浮点运算标准(IEEE 754):

4.3.19数值

原始值对应于双精度64位二进制格式IEEE 754值

4.3.23 NaN

数值是IEEE 754"非数字"值

8.5号码类型

Number类型具有18437736874454810627(即2 53 -2 64 +3)值,表示IEEE标准二进制浮点运算中指定的双精度64位格式IEEE 754值,但9007199254740990(即,2 53 -2)个不同的"不是一个号码"的IEEE标准的值在ECMAScript中被表示为单个特殊的NaN值.(注意,NaN值是由程序表达式产生的NaN.)


Cin*_*ine 5

NaN != NaN因为他们不需要SAME非数字.因此它很有意义......另外为什么浮点数+0.00和-0.00都不相同.舍入可能会使它们实际上不为零.

至于typeof,这取决于语言.并且大多数语言会说NaN是浮点数,双精度数或数字取决于它们如何对它进行分类...我知道没有语言可以说这是一个未知类型或null.


Cha*_* Ma 5

NaN是有效的浮点值(http://en.wikipedia.org/wiki/NaN)

和NaN === NaN是假的,因为它们不一定是相同的非数字