只是出于好奇。
typeof NaN
数字似乎不太合逻辑。顺便说一句,就像NaN === NaN
或NaN == NaN
返回假。这是javascript的特性之一,还是有原因呢?
编辑:谢谢您的回答。但是,要让所有人适应现实并非易事。阅读答案和Wiki我了解得更多,但仍然有类似
与NaN的比较始终会返回无序结果,即使与自身进行比较也是如此。比较谓词是信令或非信令,信令版本表示此类比较的无效异常。等式和不等式谓词是无信号的,因此x = x返回false可以用来测试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的比较始终会返回无序结果,即使与自身进行比较也是如此。
基本上,aNaN
不等于任何其他数字,包括另一个NaN
,甚至包括其自身。
比较谓词是信令通知或非信令通知,信令版本表示此类比较的无效异常。
尝试在aNaN
和另一个数字之间进行比较(小于,大于等)操作可能会导致引发异常(发出信号)或结果只是错误(未发出信号或保持安静)。
等式和不等式谓词是无信号的,因此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节:NaN
是IEEE 754“非数字”值的数字值。
维基百科上的IEEE 754
IEEE浮点算法标准是由电气和电子工程师协会建立的技术标准,也是浮点计算最广泛使用的标准[...]
标准定义
- 算术格式:二进制和十进制浮点数据集,由有限数字(包括带符号的零和次正规数),无穷大和特殊的“非数字”值(NaNs)组成
[...]
typeof NaN
'number'
之所以返回,是因为:
-
ECMAScript规范说Number类型包括NaN:
所有可能的Number值的集合,包括特殊的“非数字”(NaN)值,正无穷大和负无穷大
-
因此相应地
typeof
返回:生产UnaryExpression:
typeof
UnaryExpression的评估如下:- 令val为评估UnaryExpression的结果。
- 如果Type(val)是Reference,则
- 如果IsUnresolvableReference(val)为true,则返回
"undefined"
。 - 令val为GetValue(val)。
- 如果IsUnresolvableReference(val)为true,则返回
- 返回字符串确定由类型(VAL根据表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):
对应于双精度64位二进制格式IEEE 754值的原始值
是IEEE 754“非数字”值的数字值
Number类型正好具有18437736874454810627(即2 53 −2 64 +3)值,表示IEEE二进制浮点算术标准中指定的双精度64位格式IEEE 754值,但9007199254740990(也就是说,在ECMAScript中,IEEE标准的2 53 -2)个不同的“非数字”值表示为单个特殊的NaN值。(请注意,NaN值由程序表达式产生
NaN
。)
NaN是有效的浮点值(http://en.wikipedia.org/wiki/NaN)
NaN === NaN为假,因为它们不一定是相同的非数字
NaN != NaN
因为它们不是必需的SAME非数字。因此,这很有意义...以及为什么浮点数的+0.00和-0.00都不相同。四舍五入可能会使它们实际上不为零。
至于typeof,这取决于语言。而且大多数语言会说NaN是浮点数,双精度数或数字,具体取决于它们如何对它进行分类……我知道没有语言会说这是未知类型或null。
NaN
代表不是数字。它是数字数据类型(通常是浮点类型,但并非总是如此)的值,表示无效操作(例如除以零)的结果。
尽管其名称表明它不是数字,但用于保存它的数据类型是数字类型。因此,在JavaScript中,要求NaN
返回will的数据类型number
(alert(typeof(NaN))
清楚地证明了这一点)。
Javascript使用NaN表示遇到的任何内容,而规范无法用其他方式来表示。这并不意味着它不是数字。这是描述相遇的最简单方法。NaN表示javascript不能以任何其他方式表示它或引用它的对象。实际上,它是“未知的”。作为“未知”,它无法告诉您它是什么,即使它本身也是。它甚至不是分配给它的对象。它只能告诉你什么不是,而虚无只能用一种编程语言来数学地描述。由于数学是关于数字的,因此javascript将虚无表示为NaN。这并不意味着它不是数字。这意味着我们无法以其他任何有意义的方式阅读它。这就是为什么它可以 甚至等于自己。因为没有。
一个更好的名字NaN
,可以更精确地描述其含义,而不会造成混淆,这是一个数字例外。实际上,这是另一种伪装成具有原始类型的异常对象(通过语言设计),在这种情况下,在其错误的自比较中,该异常对象不被视为原始类型。造成混乱的地方。只要语言“不会决定”在适当的异常对象和原始数字之间进行选择,混乱就将继续存在。
NaN
两者本身臭名昭著的不平等,==
并且===
是令人困惑的设计的体现,该设计迫使此异常对象成为原始类型。这打破了基本原则的基本原则,即基本要素由其价值唯一确定。如果NaN
希望将其视为例外(可以有不同的种类),则不应将其作为原始出售。如果希望它是原始的,则必须遵守该原则。只要它被破坏了(就像我们在JavaScript中一样),并且我们不能真正在两者之间做出决定,那么对于每个参与人员而言,导致不必要的认知负担的混乱将依然存在。但是,只需在两者之间做出选择,就很容易修复它:
- 或者创建
NaN
一个特殊的异常对象,该对象包含有关异常发生的有用信息,而不是像当前实现的那样丢弃该信息,从而导致难以调试的代码; - 或创建
NaN
一个原始类型的实体number
(可以较少混淆地称为“数字”),在这种情况下,它应该与自身相等,并且不能包含任何其他信息;后者显然是次等选择。
强制NaN
输入的唯一可能的优点number
是能够将其返回到任何数值表达式中。其中,然而,使其变脆的选择,因为任何数值表达式的结果含有NaN
要么是NaN
,或者导致不可预知的结果,如NaN < 0
评估到false
的,即返回boolean
,而不是保持异常。
即使“事物就是它们的样子”,也没有什么可以阻止我们为自己做出清楚的区分,以帮助使我们的代码更可预测且更易于调试。实际上,这意味着识别那些例外并将其作为例外处理。不幸的是,这意味着需要更多代码,但是希望可以通过诸如Flowtype的TypeScript之类的工具来减轻这些负担。
然后我们得到了杂乱的安静与嘈杂的信号NaN
区别。这实际上是关于异常的处理方式,而不是异常本身,与其他异常没有什么不同。
同样,Infinity
和+Infinity
是在实线扩展中出现的数字类型的元素,但它们不是实数。在数学上,它们可以由收敛为或的实数序列表示。+
-Infinity
这仅仅是因为它NaN
是JS中Number对象的属性,与它是数字无关。
想到NAN的最好方法是它不是一个已知的数字。这就是为什么NAN!= NAN的原因,因为每个NAN值代表一个唯一的未知数。NAN是必需的,因为浮点数的值范围有限。在某些情况下,舍入会在较低位丢失的情况下发生,从而导致看起来像1.0 / 11 * 11!= 1.0的废话。大于NAN的真正大值就是一个很好的例子。
假设我们只有十根手指,则不可能尝试显示大于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是double的特殊值,但是它仍然是double。
所有parseInt
要做的就是将您的字符串“转换”为数字数据类型,因此结果始终是“数字”。仅当原始字符串不可解析时,其值为NaN。
NaN仍然是数字类型,但它表示的值不能代表有效数字。
我们可以说NaN是特例对象。在这种情况下,NaN的对象表示没有数学意义的数字。数学中还有其他一些特殊情况的对象,例如INFINITE等。
您仍然可以使用它进行一些计算,但这会产生奇怪的行为。
此处的更多信息:http : //www.concentric.net/~ttwang/tech/javafloat.htm(基于Java,不是javascript)
您必须爱Javascript。它有一些有趣的小怪癖。
如果您停止逻辑地解决它们,或者如果您对数论有所了解,那么可以解释大多数这些怪癖,但是,如果您不了解它们,它们仍然可以帮助您。
顺便说一句,我建议您阅读http://wtfjs.com/的其余部分-还有比这个有趣的怪癖!
NaN值实际上是Number.NaN,因此当您询问是否为数字时,它将说是。您通过使用isNaN()调用完成了正确的操作。
作为参考,NaN还可以通过对未定义的数字进行操作来返回,例如未除以零或负数的平方根。
一个例子
想象一下,我们正在将字符串转换为数字:
Number("string"); // returns NaN
我们将数据类型更改为数字,但其值不是数字!
这是数字类型的特殊值,为POSITIVE_INFINITY
为什么?通过设计
文章标签:javascript , nan
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!