我发现了很多关于undefined as value 的讨论,例如如何检查是否相等等。但是undefined作为全局变量存在的“工程”原因是什么?对面没有空变量...
console.log(undefined in this); // logs true
console.log(null in this); // logs false
我发现了很多关于undefined as value 的讨论,例如如何检查是否相等等。但是undefined作为全局变量存在的“工程”原因是什么?对面没有空变量...
console.log(undefined in this); // logs true
console.log(null in this); // logs false
在 JavaScript 中,null
是一个保留字;undefined
不是,而是由环境实现为值为 的全局变量undefined
。
您会注意到您可以更改的值undefined
,但不能更改 的值null
,除非在严格模式(会引发错误)或 ES5(会忽略分配)中。
现在,为什么undefined
不保留,我不知道。
简单的答案是 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>