我们可以做:
NaN = 'foo'
以及
undefined = 'foo'
为什么它们没有保留关键字?
我认为应该实现它,以确保当我们寻找
number
时,它是number
:(如果我们应该使用
IsNaN()
或typeof
,为什么需要NaN
或undefined
?
我不能告诉你为什么,但undefined
和NaN
实际上是全局对象的属性:
15.1.1全局对象的值属性
15.1.1.1 NaN
NaN的值为NaNalse、[[Enumerable]]:false、[Configuration]]:false[/strong>}
(…(
15.1.1.3未定义undefined
的值为未定义(请参阅8.1(。此属性具有属性{[[Writable]]:false、[[Enumerable]]:false、[Configuration]]:false[/strong>}。
值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()
。
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN
NaN是全局对象的一个属性。
NaN的初始值为Not-A-Number,与在现代浏览器中,NaN是不可配置的,不可写属性。即使不是这样,也要避免覆盖它。
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/undefined
undefined是全局对象的一个属性,即它是全局范围内的一个变量。
undefined的初始值是未定义的基元值。
我现在在猜测,但我认为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
与全局标识符放在一起的原因!
我希望这能澄清问题!
NaN
和undefined
都是JavaScript中的值。
NaN
为数字型。(表示"不是有效数字"(undefined
属于未定义类型。(当变量没有任何赋值时,JavaScript会在var
声明中指定undefined
(
而且两者都是全局窗口对象的只读值(属性(。
因此,JavaScript不能将值作为保留字。
NaN
不是关键字,但它是全局对象的内置属性,因此可以被替换(与undefined
类似,但与关键字this或文字true
、false
和null
不同(。
您可以使用isNaN()
函数测试一个值是否为NaN。此外,NaN
被定义为不等于一切,包括它自己。
或者简而言之,你可以说:
NaN
是当您试图将非数字的东西视为数字时返回的值。例如,7乘以"abc"的结果不是一个数字。它的旧形式是Number.NaN。您可以使用isNaN()
函数测试非数字值。
一个原因是可以将这些单词用作对象键:
messages = {
NaN: 'that was not a number',
undefined: 'that was not initialized',
default: 'that was something' // not in the original question but is valid syntax
};
console.log (messages.NaN);
虽然可以使用{ 'NaN': 'that was not a number' }
和console.log(messages['NaN'])
,但保留尽可能多的单词可以使代码更容易阅读。