为什么NaN是JavaScript中的全局变量?

5
我注意到NaN被实现为一个全局变量 (window.NaN),其值为NaN
为什么会这样呢?难道它不应该是一个表示值的保留字,就像truefalsenull一样吗? 编辑:显然,这是在规范中定义的,还有undefinedInfinity。JavaScript,你在干什么?!

你是如何检查它的定义的? - Shiplu Mokaddim
1
undefined 也不是一个保留字。 - rhino
@rhino 很好的发现,将其更改为问题中。 - Daniel Weiner
2个回答

8

这不仅是以这种方式实现,而且还规定为此

15.1.1 全局对象的值属性

15.1.1.1 NaN

NaN的值为NaN(见8.5)。此属性具有以下属性:{[[Writable]]: false,[[Enumerable]]: false,[[Configurable]]: false}。

15.1.1.2 Infinity

Infinity的值为+∞(见8.5)。此属性具有以下属性:{[[Writable]]: false,[[Enumerable]]: false,[[Configurable]]: false}。

15.1.1.3 undefined

undefined的值为undefined(见8.1)。此属性具有以下属性:{[[Writable]]: false,[[Enumerable]]: false,[[Configurable]]: false}。

(全局对象是浏览器中的窗口对象。)不遵守规范的实现是违反规范的。:-)

至于为什么:规范似乎没有说明原因,所以除非有人能找到Brendan Eich解释他的理由的引用...:-)我只会猜测提到将它们设置为全局变量有点不那么限制:如果您不需要访问全局变量,则可以在代码中使用本地Infinity变量表示其他内容。如果它是保留字,您不能这样做。当然,这也开启了麻烦之门,所以...


如果那是一个保留字,你就不能这样做。即使它们不是保留字,你也永远不应该这样做。很奇怪的是,在一种语言中拥有一个功能,正如你所说,“为麻烦敞开了大门”,却没有充分的理由去这样做。 - Daniel Weiner
1
@DanielWeiner:哦,我完全同意你不应该那样做(尽管如果那些不知道它的人经常遮蔽Infinity,我会感到惊讶)。 - T.J. Crowder
我会接受你的答案作为正确的答案,但这是我在 JavaScript 中看到的最 WTF 的事情之一。而且我见过很多。 - Daniel Weiner
@DanielWeiner:我没有找到Eich的解释这个决定的任何信息。如果有人能找到就太好了。很可能是“因为我在1995年五月份只有10天的时间来完成JavaScript,然后就发生了这个事情。” :-) - T.J. Crowder
@DanielWeiner 我同意你的观点:对于 var a=NaN; 这个变量,比较 a==a 总是会返回 false。而且 typeof NaN 的结果是 "number"(Not a Number 是一个数字?真是醉了!) - Pablo Lozano
1
@Pablo:typeof NaN"number" 完全合理,因为 NaN 是 IEEE-754 双精度浮点数(JavaScript 和大多数现代语言使用的类型)中具有特定含义的值。因此,它是该值的数字类型表示。这就像 null 的类型为对象一样:它是被标记为对象引用的东西,它引用了不存在的对象。但我从来没有理解过为什么 NaN 不等于它自己。(甚至在新的 MapSet 中也对此进行了特殊处理:如果 NaN 是映射中的键或集合中的值,则与任何其他数字一样匹配。) - T.J. Crowder

0

NaN是JavaScript的全局属性,与未定义(undefined)或无穷大(infinity)一样在同一级别上定义。

请参见下图:

Nan and other global properties

它是全局的这一事实使得访问尽可能广泛。JavaScript 全局属性和函数可用于所有内置的 JavaScript 对象。


4
如果像OP所提到的那样它是一个保留字,它也会有最广泛的访问权限,而且你不能使用同名变量。但由于它是全局变量,它具有最广泛的访问权限。 - T.J. Crowder
@T.J. Crowder 没错。然后我们必须猜测为什么NaN被指定为它被指定的方式。 - alainlompo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接