我们可以这样做:
NaN = 'foo'
以及
undefined = 'foo'
为什么他们不是保留关键字?
编辑1(DownVoters):
我认为应该实施它,以确保在我们寻找number
时,它是number
:)
如果我们应该使用IsNaN()
或typeof
,那么为什么需要NaN
或undefined
?
答案 0 :(得分:8)
我无法告诉您为什么,但undefined
和NaN
实际上是全局对象的属性:
15.1.1 Value Properties of the Global Object
15.1.1.1 NaN
NaN 的值为 NaN (see 8.5)。此属性具有{[[Writable]]属性: false ,[[Enumerable]]: false ,[[Configurable]]: false }。
(...)
15.1.1.3 undefined
undefined
的值为未定义(see 8.1)。此属性具有{[[Writable]]属性: false ,[[Enumerable]]: false ,[[Configurable]]: false }。
值 undefined
(NaN
)与相应的属性之间存在差异。
您可能会注意到[[Writable]]: false
。我不确定ES5中是否有新功能(并且可能不适用于所有浏览器),但在较新的浏览器(在Firefox 6中测试过)中,为undefined
分配新值无效:
[12:28:15.090] < undefined = "foo"
[12:28:15.093] > "foo"
[12:28:19.882] < undefined
[12:28:19.883] > undefined
所以虽然似乎你可以指定一个新值,但实际上不能。
为什么他们不是保留关键字?
不确定是否有特定原因不使其成为保留关键字,但是已经决定反对它。语言仍然有效。你不能覆盖这些值,所以没关系。
测试某个数字是否为NaN
的唯一方法是使用isNaN()
。
答案 1 :(得分:7)
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN
NaN是全局对象的属性。
NaN的初始值是Not-A-Number - 与值相同 Number.NaN。在现代浏览器中,NaN是不可配置的, 不可写财产。即使不是这种情况,也要避免 压倒它。
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/undefined
undefined是全局对象的属性,即它是全局范围内的变量。
undefined的初始值是未定义的原始值。
答案 2 :(得分:3)
我现在在推测,但我认为NaN
和undefined
不是关键字的原因是因为您通常不会将这些值分配给变量。
var x = undefined; // doesn't make sense, use null!
var y = NaN; // You can't do much with this variable!
undefined
基本上意味着uninitialized
,如果您想明确该值未知,请使用null
。所以undefined
通常意味着未初始化或JavaScript代码的结果出错。
NaN
很少手动分配,只是因为您无法对此值做多少工作。这通常是计算错误的结果。 JavaScript的制造者可能不希望将这个值赋予原始值的可见性。
此外,NaN
也存在于其他语言中,也不会用作关键字。例如:在C#
中,NaN由Double.NaN
表示,因为您没有区分JavaScript中的浮点值和整数值,我猜这就是为什么他们将NaN
放在一起全球标识符!
我希望这能解决问题!
答案 3 :(得分:1)
NaN
不是关键字,而是全局对象的内置属性,因此可以替换(例如undefined
,但不像关键字this或文字{{ 1}},true
和false
)。
您可以使用null
函数测试值是否为NaN。此外,isNaN()
被定义为对所有事物都不相等,包括其本身。
或者在坚果壳中你可以这么说:
NaN
是当您尝试将非数字作为数字处理时返回的值。例如,7次“abc”的结果不是数字。它的旧形式是Number.NaN您可以使用NaN
函数测试非数字值。
希望这有帮助。
答案 4 :(得分:1)
NaN
和undefined
都是JavaScript中的值。
NaN
是数字类型。 (表示“无效数字”)。undefined
是未定义的类型。 (当没有为变量分配任何内容时,JavaScript将为undefined
声明中的var
赋值)。而且都是全局窗口对象的只读值(属性)。
这就是为什么 JavaScript无法将值作为保留字的原因。