只是出于好奇。

typeof NaN是number似乎不太符合逻辑。就像NaN === NaN或NaN == NaN返回false。这是JavaScript的特性之一吗,或者有什么原因吗?

编辑:谢谢你的回答。然而,让人明白这不是一件容易的事情。阅读答案和维基我明白了更多,但仍然,一句话像

与NaN的比较总是返回无序结果,即使是与NaN本身比较也是如此。比较谓词是信号或非信号,信号版本表示此类比较的无效异常。等式和不等式谓词是非信号,因此x = x返回false可用于测试x是否为静态NaN。

让我头晕目眩。如果有人能把它翻译成人类(而不是数学家)可读的语言,我会很感激。


当前回答

typeof NaN返回'number',因为:

ECMAScript spec says the Number type includes NaN: 4.3.20 Number type set of all possible Number values including the special “Not-a-Number” (NaN) values, positive infinity, and negative infinity So typeof returns accordingly: 11.4.3 The typeof Operator The production UnaryExpression : typeof UnaryExpression is evaluated as follows: Let val be the result of evaluating UnaryExpression. If Type(val) is Reference, then If IsUnresolvableReference(val) is true, return "undefined". Let val be GetValue(val). Return a String determined by Type(val) according to Table 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". | ------------------------------------------------------------------

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

4.3.19 Number value primitive value corresponding to a double-precision 64-bit binary format IEEE 754 value 4.3.23 NaN number value that is a IEEE 754 “Not-a-Number” value 8.5 The Number Type The Number type has exactly 18437736874454810627 (that is, 253−264+3) values, representing the double-precision 64-bit format IEEE 754 values as specified in the IEEE Standard for Binary Floating-Point Arithmetic, except that the 9007199254740990 (that is, 253−2) distinct “Not-a-Number” values of the IEEE Standard are represented in ECMAScript as a single special NaN value. (Note that the NaN value is produced by the program expression NaN.)

其他回答

我们可以认为NaN是一个特殊情况对象。在本例中,NaN的对象表示一个没有数学意义的数字。数学中还有一些特殊情况的对象,比如INFINITE等等。

你仍然可以用它做一些计算,但这会产生奇怪的行为。

更多信息在这里:http://www.concentric.net/~ttwang/tech/javafloat.htm(基于java,不是javascript)

它是Number类型的特殊值,如POSITIVE_INFINITY

为什么?通过设计

NaN != NaN,因为它们不是相同的非数字。因此……很有道理。 浮点数+0.00和-0.00不一样的原因。四舍五入可以做到它们实际上不为零。

至于typeof,这取决于语言。大多数语言会说NaN是浮点数、双精度数或数字,这取决于他们如何对它进行分类……据我所知,没有一种语言会说这是未知类型或null。

考虑NAN的最好方法是它不是一个已知的数字。这就是为什么NAN != NAN,因为每个NAN值代表一个唯一的未知数字。nan是必要的,因为浮点数的值范围有限。在某些情况下,舍去小数位会丢失,导致出现像1.0/11*11 != 1.0这样的无意义的结果。真正大的值是nan,无穷大就是一个很好的例子。

鉴于我们只有十个手指,任何显示大于10的值的尝试都是不可能的,这意味着这些值必须是nan,因为我们已经丢失了这个大于10的值的真实值。浮点值也是如此,其值超过了浮点数所能容纳的限制。

你必须热爱Javascript。它有一些有趣的小怪癖。

http://wtfjs.com/page/13

如果你停下来从逻辑上算出这些怪癖,或者如果你知道一点数论,大多数怪癖都可以解释清楚,但如果你不知道它们,它们仍然会让你出错。

顺便说一下,我建议你阅读http://wtfjs.com/的其余部分——还有很多比这个更有趣的怪癖!