为什么访问一个不存在的对象 属性 会导致 `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
尽管 a
和 why
从未在任何地方声明过,但为什么允许这些?
因为对象属性不是变量。规则不同。访问不存在的对象 属性 会给您 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
当我尝试使用未声明的变量时,我得到 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
尽管 a
和 why
从未在任何地方声明过,但为什么允许这些?
因为对象属性不是变量。规则不同。访问不存在的对象 属性 会给您 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