只是出于好奇。

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

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

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

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


当前回答

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

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

其他回答

它的意思是不是一个数字。这不是javascript的特性,而是常见的计算机科学原理。

从http://en.wikipedia.org/wiki/NaN:

There are three kinds of operation which return NaN: Operations with a NaN as at least one operand Indeterminate forms The divisions 0/0, ∞/∞, ∞/−∞, −∞/∞, and −∞/−∞ The multiplications 0×∞ and 0×−∞ The power 1^∞ The additions ∞ + (−∞), (−∞) + ∞ and equivalent subtractions. Real operations with complex results: The square root of a negative number The logarithm of a negative number The tangent of an odd multiple of 90 degrees (or π/2 radians) The inverse sine or cosine of a number which is less than −1 or greater than +1.

所有这些值可能都不相同。NaN的一个简单测试是测试value == value为false。

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是一个有效的浮点值(http://en.wikipedia.org/wiki/NaN)

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

好吧,这似乎有点奇怪,所谓的“不是一个数字”被认为是一个数字,但NaN仍然是一个数字类型,尽管事实如此:-)

NaN仅仅意味着特定的值不能在数字类型的限制范围内表示(尽管这可以说是所有必须四舍五入以适应的数字,但NaN是一个特殊情况)。

一个特定的NaN不等同于另一个NaN,因为它们可能是不同的值。然而,NaN仍然是一种数字类型,就像2718或31415一样。


至于你更新的问题,用外行的话解释一下:

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

所有这一切的意思是(分解为几个部分):

与NaN的比较总是返回无序结果,即使是与NaN本身比较也是如此。

基本上,一个NaN不等于任何其他数字,包括另一个NaN,甚至包括它自己。

比较谓词是信号或非信号,信号版本表示此类比较的无效异常。

试图在一个NaN和另一个数字之间进行比较(小于、大于等)操作,可能导致抛出异常(发出信号),也可能导致结果为false(非发出信号或为quiet)。

等式和不等式谓词是无信号的,因此x = x返回false可用于测试x是否为静态NaN。

相等(等于,不等于)的测试永远不会发出信号,因此使用它们不会导致异常。如果有一个正则数x,那么x == x总是成立的。如果x是一个NaN,那么x == x将永远是假的。它为您提供了一种轻松(悄悄)检测NaN的方法。

如果使用jQuery,我更喜欢isNumeric检查类型:

console.log($.isNumeric(NaN));  // returns false
console.log($.type(NaN));       // returns number

http://api.jquery.com/jQuery.isNumeric/