JavaScript 中全局范围内存在未定义变量的原因是什么?

What is the reason for the existence of undefined variable in the global scope in JavaScript?

本文关键字:是什么 变量 未定义 全局 范围内 存在 JavaScript      更新时间:2023-09-26

我发现很多关于未定义为值的讨论,例如如何检查是否相等等。但是,未定义为全局变量存在的"工程"原因是什么?相反没有变量...

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

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

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

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

简单的答案是 ECMAScript 定义了全局对象的一个属性,称为 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 过早优化,有一些基本问题应该早点解决,但现在改变它们为时已晚(并且已经很多年了)。

如果像null一样实现undefined(即作为全局对象的只读属性),并且

typeof undefined === 'undefined'

typeof null === 'null'

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

然后是NaN...