只是出于好奇。

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

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

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

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


当前回答

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

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

其他回答

NaN仍然是数字类型,但它表示不能表示有效数字的值。

NaN值实际上是Number。因此,当你问它是否是一个数字时,它会说是的。使用isNaN()调用是正确的。

作为信息,NaN也可以通过对未定义的数字(如除零或负数的平方根)的操作返回。

这只是因为NaN是JS中Number对象的一个属性,它与它是否是一个数字无关。

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

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

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

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

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