7

我发现了很多关于undefined as value 的讨论,例如如何检查是否相等等。但是undefined作为全局变量存在的“工程”原因是什么?对面没有空变量...

console.log(undefined in this);  // logs true
console.log(null in this);  // logs false
4

2 回答 2

5

在 JavaScript 中,null是一个保留字;undefined不是,而是由环境实现为值为 的全局变量undefined

您会注意到您可以更改的值undefined,但不能更改 的值null除非在严格模式(会引发错误)或 ES5(会忽略分配)中。

现在,为什么undefined不保留,我不知道。

于 2013-11-11T22:12:29.440 回答
0

简单的答案是 ECMAScript 定义了一个名为undefined的全局对象的属性,其初始值为undefined。这个对象是在进入任何执行上下文之前创建的,所以它总是在任何代码运行之前就存在。

测试未定义值可能很方便,否则通常会执行以下操作:

var undefined;

// test against undefined.

function foo() {

    // And maybe here too
    var undefined;

   // test against undefined.
}

由于全局未定义属性没有写保护,因此通常会执行以下操作:

(function(global, undefined) {

  // In here you can be sure undefined has the value undefined

}(this));

编辑

总之,目标似乎是创建两种不同的方式来返回“没有值”的值,其中undefined表示“我的值根本没有定义”,而null表示“我没有值” .

例如

function getElement(id) {
  if (document && document.getElementById) {
    return document.getElementById(id);
  }
  // return undefined implied
}

如果上面的函数返回null,你知道它运行成功但没有找到具有提供的 id 的元素,而如果它返回undefined,你知道它甚至没有尝试。

关于:

对面没有空变量

我猜你是在说“为什么是undefined全局变量而null全局对象是全局对象。

答案是一样的:因为规范就是这样写的。一种解释(不是原因)是 JavaScript 过早地优化,有一些基本问题应该早点解决,但现在改变它们为时已晚(并且已经有很多年了)。

undefined如果像这样实现null(即作为全局对象的只读属性),也许会更好(恕我直言) :

typeof undefined === 'undefined'

typeof null === 'null'

因为这就是他们的实际情况。但现在改变这一点可能会产生比它解决的问题更多的问题。

然后是NaN……</p>

于 2013-11-11T23:15:18.450 回答