题
只是出于好奇。
这似乎不太符合逻辑 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
将永远是正确的。如果x
是NaN
,然后x == x
将永远是假的。它很容易给你一个方法来检测NaN
(悄悄)。
ECMAScript (JavaScript) 标准指定 Numbers
是 IEEE 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:
包括特殊的 "非数字 "在内的所有可能的 "数字 "值的集合 (NaN) 值、正无穷大和负无穷大
所以
typeof
相应地返回:生产 一元表达式 :
typeof
一元表达式 是 评估结果如下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):
与双精度 64 位二进制相对应的基元值 格式 IEEE 754 值
number 值是 IEEE 754“Not-a-Number”值
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
的Javascript仅具有一个数字数据类型,这是标准的64位双精度浮点。一切都是一个双。为NaN是双重的特殊值,但它是一个双仍然。
所有这些parseInt
所做的是“转换”您的字符串转换成数字数据类型,所以结果是总是“数量”;仅当原始字符串不是可解析的,其值将是为NaN。
NaN的仍然是一个数字型的,但它代表了不能代表一个有效的数字值。
我们可以说楠是个特例对象。在这种情况下,NaN的对象代表一个数字,是没有数学意义。有像无限数学等其他一些特殊情况的对象。
您仍然可以做一些计算它,但会产生怪异的行为。
在此处了解详情: http://www.concentric.net/~ttwang/高科技/ javafloat.htm (基于Java,JavaScript不)
您已经有了爱的JavaScript。它有一些有趣的小怪癖。
大多数的怪癖可以,如果你停止给他们锻炼逻辑解释,或者如果你知道一些关于数论,但尽管如此,他们仍然可以赶上你,如果你不知道他们。
顺便说一句,我建议你阅读 http://wtfjs.com/ 的其余部分 - 有很多比这更有趣的怪癖被发现!
NaN值是真正的Number.NaN因此,当你问,如果它是一个数字,你会说是的。您可以通过使用isNaN()调用做了正确的事情。
有关的信息,为NaN也可通过操作上未由负数的零或平方根等区划定义数返回。
一个例子
想象我们将字符串转换为一个数字:
Number("string"); // returns NaN
我们改变了数据类型数目,但它的值是不是数字!
这是因为POSITIVE_INFINITY数字类型的特殊值
为什么呢?通过设计