为什么访问一个不存在的对象 属性 会导致 `undefined` 而不是抛出 `ReferenceError`?

Why does accessing a non-existent object property result in `undefined` instead of throwing a `ReferenceError`?

当我尝试使用未声明的变量时,我得到 ReferenceError:

console.log(a); // Uncaught ReferenceError: a is not defined

我可以先使用一个变量,然后再定义它,不会因为提升而成为问题。

console.log(a); // undefined

var a;

但是当我声明一个对象时,为什么执行上下文允许我使用它的任何 属性?

var obj = {};

console.log(obj.a); // undefined
console.log(obj.why); // undefined

尽管 awhy 从未在任何地方声明过,但为什么允许这些?

因为对象属性不是变量。规则不同。访问不存在的对象 属性 会给您 undefined,而不是错误。这就是语言的设计方式。

一个可能的 解释 的区别,除此之外 "that's how Eich designed it," 是你没有 声明 对象属性.你只是使用它们。但是必须声明变量(The Horror of Implicit Globals 除外,我们现在没有严格模式)。

语言设计已指定尝试访问对象上不存在的 属性 只会 return undefined.

var obj = {};
console.log(obj.a);   // undefined

但是,尝试访问未在当前或父范围内的任何位置定义的变量是 ReferenceError。

console.log(b);       // ReferenceError

Why are these allowed even though a and why are never declared anywhere?

这就是语言的设计方式。我能看出它是这样的一些原因,但决定这样做的真正原因只存在于一些原始设计师的头脑中。我们此时的工作是了解它的工作原理并编写与当前设计兼容的代码(因为我们无法更改当前的语言设计)。


有一些方法可以通过测试这些未定义的变量来解决这个问题,例如:

if (typeof b === "undefined")

或者,如果您在浏览器中并且期望 b 是一个全局变量,您可以使用全局变量附加到 window 对象和那个丢失的对象这一事实属性不会像这样创建 ReferenceErrors:

console.log(window.b);   // undefined