为什么访问不存在的对象属性会导致“未定义”而不是抛出“ReferenceError”?

dog*_*ant 3 javascript variables object-properties

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

\n
console.log(a); // Uncaught ReferenceError: a is not defined\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
console.log(a); // undefined\n\nvar a;\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
var obj = {};\n\nconsole.log(obj.a); // undefined\nconsole.log(obj.why); // undefined\n
Run Code Online (Sandbox Code Playgroud)\n

为什么这些是允许的,并且a从未why在任何地方声明过?

\n

T.J*_*der 5

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

除了“这就是 Eich 的设计方式”之外,对这种差异的一种可能的解释是,您没有声明对象属性。你只需使用它们。但变量必须被声明(除了隐式全局变量的恐怖,我们现在没有声明,我们有严格模式)。