只是出于好奇。

这似乎不太符合逻辑 typeof NaN 是数字。就像 NaN === NaN 或者 NaN == NaN 顺便说一句,返回 false。这是 javascript 的特性之一吗?或者有什么原因吗?

编辑:感谢您的回答。然而,要让人们头脑清醒并不是一件容易的事。阅读答案和维基我了解更多,但仍然是这样的一句话

即使与 NaN 本身进行比较,与 NaN 的比较也始终返回无序结果。比较谓词要么是信令的,要么是非信令的,信令版本表示此类比较的无效异常。等式和不等式谓词是无信号的,因此返回 false 的 x = x 可用于测试 x 是否是安静的 NaN。

只是让我头晕目眩。如果有人可以将其翻译成人类(而不是数学家)可读的语言,我将不胜感激。

有帮助吗?

解决方案

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

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

有三种返回NAN的操作:

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

不定形式

  • 划分 0/0、∞/∞、∞/−∞、−∞/∞ 和 −∞/−∞
  • 乘法 0×∞ 和 0×−∞
  • 幂 1^∞
  • 加法 ∞ + (−∞)、(−∞) + ∞ 以及等效的减法。

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

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

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

其他提示

好了,NaN仍然是一个数字的键入的,尽管它实际上代表的不是一个数: - )

NaN只是意味着该特定值可以不是数字类型的限制范围内被表示(虽然可能对于必须被舍入到配合的所有数字可以说,但NaN是一种特殊的情况)。

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


至于你更新的问题通俗地说解释:

  

与NaN的比较总是返回即使与比较本身的无序的结果。比较谓词要么信令或非信令,该信令信号的版本为这种比较无效的异常。的等式和不等式谓词非信令所以X = X返回false可用于测试,如果x是一个静态NaN。

所有这些装置(分解成份):

  

与NaN的比较总是即使本身进行比较时,返回一个无序的结果。

基本上,NaN不等于任何其它数量,包括另一NaN,甚至包括本身

  

在比较谓词要么信令或非信令,该信令信号的版本为这种比较无效的异常。

试图做对比(小于,大于,等等更高)一NaN和另一个号码可以导致异常之间的操作被抛出(信令)或刚开false作为结果(非信令或安静)

  

在等式和不等式谓词非信令所以X = X返回false可用于测试,如果x是一个静态NaN。

的相等测试(等于,不等于)从未信令所以使用它们不会引起一个异常。如果您有一个普通号x,然后x == x将永远是正确的。如果xNaN,然后x == x将永远是假的。它很容易给你一个方法来检测NaN(悄悄)。

ECMAScript (JavaScript) 标准指定 NumbersIEEE 754 漂浮物,其中包括 NaN 作为一个可能的值。

ECMA 262 5e 第 4.3.19 节: :数值

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

ECMA 262 5e 第 4.3.23 节: :南

IEEE 754“非数字”值的数值。

IEEE 754 在维基百科上

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

该标准定义了

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

[...]

typeof NaN 回报 'number' 因为:

  • ECMAScript 规范规定 Number 类型包括 NaN:

    4.3.20 数字类型

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

  • 所以 typeof 相应地返回:

    11.4.3 运算符的类型

    生产 一元表达式 : typeof 一元表达式 是 评估结果如下

    1. 瓦尔 是评估的结果 一元表达式.
    2. 如果 类型(瓦尔) 是 参考, , 然后
      1. 如果 无法解析引用(瓦尔) 是 真的, , 返回 "undefined".
      2. 瓦尔获取价值(瓦尔).
    3. 返回由以下确定的字符串 类型(瓦尔)根据表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 数值

与双精度 64 位二进制相对应的基元值 格式 IEEE 754 值

4.3.23 南

number 值是 IEEE 754“Not-a-Number”值

8.5 数字类型

Number 类型正好有 18437736874454810627 (即 253−264 3) 值,代表双精度 64 位格式 IEEE 754 二进制浮点运算的 IEEE 标准中规定的值。 算术,但 9007199254740990(即 253-2)不同 IEEE 标准的 "非数字 "值用以下表格表示 ECMAScript 作为一个单一的特殊 价值。(请注意, 价值 由程序表达式 NaN.)

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

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

NaN != NaN因为它们不必是相同的非数字。因此,它使一个很大的意义... 也是为什么花车兼得+0.00和-0.00那是不一样的。舍入可以做,他们实际上是不为零。

至于typeof运算,依赖于语言。和大多数语言会说楠是一个浮动,这取决于他们如何把它归类双人或数......我不知道语言是会说,这是一个未知类型或空的。

NaN代表不是数字。它是一个表示一个无效的操作的结果,例如除以零的数值数据类型(通常浮点类型,但不总是)的值。

虽然它的名字说,这是不是一个数字,用来装它是一种数字型数据类型。所以在JavaScript中,要求NaN的数据类型将返回number(如alert(typeof(NaN))清楚地表明)。

JavaScript使用的NaN来表示任何它遇到不能被表示通过其规格的任何其他方式。这并不意味着它是不是一个数字。这只是描述遇到的最简单的方法。为NaN意味着它或者是适用于它的对象不能在由JavaScript任何其它方式来表示。对于所有的实际目的,这是“未知”。作为“未知”它不能告诉你它是什么,也没有哪怕是自己。它甚至不是它被分配给对象。它只能告诉你它不是什么,只能在编程语言数学描述不岬或虚无。因为数学是关于数字,JavaScript的代表虚无的NaN的。这并不意味着它不是一个数字。这意味着我们不能读它是有道理的任何其他方式。这就是为什么它甚至不能等于本身。因为它没有。

更好的名字 NaN, ,更准确地描述其含义并且不那么令人困惑,将是 数值异常. 。它实际上是另一种伪装成具有原始类型的异常对象(通过语言设计),同时它在错误的自我比较中不被视为原始类型。混乱从何而来。而只要语言“不会下定决心”之间做出选择 正确的异常对象原始数词, ,混乱将继续存在。

臭名昭著的不平等 NaN 对自身而言,两者 ===== 是强制此异常对象成为原始类型的混乱设计的表现。这打破了一个基本原则: 原语由其值唯一确定. 。如果 NaN 最好被视为例外(可以有不同的种类),那么它不应该被“出售”为原始的。如果它想要原始,这个原则就必须成立。只要它被破坏了,就像我们在 JavaScript 中那样,并且我们无法真正在两者之间做出决定,那么导致每个相关人员不必要的认知负担的混乱就会继续存在。然而,只要在两者之间做出选择,这个问题就很容易解决:

  • 要么让 NaN 一个特殊的异常对象,包含有关异常如何发生的有用信息,而不是将该信息作为当前实现的信息丢弃,从而导致代码难以调试;
  • 或使 NaN 原始类型的实体 number (这可以不那么容易混淆地称为“数字”),在这种情况下它应该等于其自身并且不能包含任何其他信息;后者显然是一个较差的选择。

强迫的唯一可以想象的好处 NaN 进入 number 类型能够将其返回到任何数字表达式中。然而,这使得选择变得脆弱,因为任何包含以下内容的数值表达式的结果 NaN 将是 NaN, ,或导致不可预测的结果,例如 NaN < 0 评价为 false, , IE。返回 boolean 而不是保留异常。

即使“事情就是这样”,也没有什么可以阻止我们自己做出明确的区分,以帮助我们的代码更可预测、更容易调试。实际上,这意味着识别这些异常并将其作为异常进行处理。不幸的是,这意味着更多的代码,但希望可以通过 Flowtype 的 TypeScript 等工具来缓解。

然后我们就有了凌乱的情况 安静与嘈杂(又名信号) NaN 区别. 。这实际上是关于如何处理异常,而不是异常本身,与其他异常没有什么不同。

相似地, Infinity+Infinity 是以下元素 数字类型 产生于 实线的延长 但它们不是实数。在数学上,它们可以用收敛于任一的实数序列来表示 + 或者 -Infinity.

这仅仅是因为NaN是在JS Number对象的属性,它无关它是一个数。

思考 NAN 的最好方式是它不是 已知的 数字。这就是为什么 NAN != NAN 因为每个 NAN 值都代表一些唯一的未知数。NAN 是必要的,因为浮点数的值范围有限。在某些情况下,四舍五入会导致低位丢失,从而导致看似无意义的结果,例如 1.0/11*11 != 1.0。真正更大的值是无穷大的 NAN 就是一个完美的例子。

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

由于NaN的是一个数值数据类型。

NaN是从一个类型的点的数,而不是像1,2或329131.名称的正常数量的“非数字” 指的是值表示的事实特别是关于IEEE格式规范域,而不是JavaScript语言域。

如果使用jQuery,我宁愿isNumeric过检查的类型:

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

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

的Javascript仅具有一个数字数据类型,这是标准的64位双精度浮点。一切都是一个双。为NaN是双重的特殊值,但它是一个双仍然。

所有这些parseInt所做的是“转换”您的字符串转换成数字数据类型,所以结果是总是“数量”;仅当原始字符串不是可解析的,其值将是为NaN。

NaN的仍然是一个数字型的,但它代表了不能代表一个有效的数字值。

我们可以说楠是个特例对象。在这种情况下,NaN的对象代表一个数字,是没有数学意义。有像无限数学等其他一些特殊情况的对象。

您仍然可以做一些计算它,但会产生怪异的行为。

在此处了解详情: http://www.concentric.net/~ttwang/高科技/ javafloat.htm (基于Java,JavaScript不)

您已经有了爱的JavaScript。它有一些有趣的小怪癖。

http://wtfjs.com/page/13

大多数的怪癖可以,如果你停止给他们锻炼逻辑解释,或者如果你知道一些关于数论,但尽管如此,他们仍然可以赶上你,如果你不知道他们。

顺便说一句,我建议你阅读 http://wtfjs.com/ 的其余部分 - 有很多比这更有趣的怪癖被发现!

NaN值是真正的Number.NaN因此,当你问,如果它是一个数字,你会说是的。您可以通过使用isNaN()调用做了正确的事情。

有关的信息,为NaN也可通过操作上未由负数的零或平方根等区划定义数返回。

一个例子

想象我们将字符串转换为一个数字:

Number("string"); // returns NaN

我们改变了数据类型数目,但它的值是不是数字!

这是因为POSITIVE_INFINITY数字类型的特殊值

为什么呢?通过设计

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top