为什么 'NaN' 和 'Undefined' 不是 JavaScript 中的保留关键字?



我们可以做:

NaN = 'foo'

以及

undefined = 'foo'

为什么它们没有保留关键字?

  1. 我认为应该实现它,以确保当我们寻找number时,它是number:(

  2. 如果我们应该使用IsNaN()typeof,为什么需要NaNundefined

我不能告诉你为什么,但undefinedNaN实际上是全局对象的属性

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的初始值是未定义的基元值。

我现在在猜测,但我认为NaNundefined不是关键字的原因是因为通常不会将这些值分配给变量。

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与全局标识符放在一起的原因!

我希望这能澄清问题!

NaNundefined都是JavaScript中的

  1. NaN为数字型。(表示"不是有效数字"(
  2. undefined属于未定义类型。(当变量没有任何赋值时,JavaScript会在var声明中指定undefined(

而且两者都是全局窗口对象的只读值(属性(。

因此,JavaScript不能将值作为保留字

NaN不是关键字,但它是全局对象的内置属性,因此可以被替换(与undefined类似,但与关键字this或文字truefalsenull不同(。

您可以使用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']),但保留尽可能多的单词可以使代码更容易阅读。

最新更新