首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么访问不存在的对象属性会导致“未定义”而不是抛出“引用错误”?

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

Stack Overflow用户
提问于 2015-08-09 07:38:04
回答 2查看 289关注 0票数 3

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

代码语言:javascript
运行
复制
console.log(a); // Uncaught ReferenceError: a is not defined

我可以先使用一个变量,然后定义它,这不会是一个问题,因为吊装。

代码语言:javascript
运行
复制
console.log(a); // undefined

var a;

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

代码语言:javascript
运行
复制
var obj = {};

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

尽管awhy从来没有在任何地方声明过,但为什么允许这样做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-09 07:47:37

语言设计已经指定,尝试访问对象上不存在的属性只会返回undefined

代码语言:javascript
运行
复制
var obj = {};
console.log(obj.a);   // undefined

但是,试图访问当前或父作用域中没有定义的变量是一个ReferenceError。

代码语言:javascript
运行
复制
console.log(b);       // ReferenceError

为什么这些是允许的,即使a和为什么从来没有声明在任何地方?

语言就是这样设计的。我可以看到这样做的一些原因,但真正的原因,它被决定这样做,只是在一些最初的设计师的头脑中。我们目前的工作是了解它是如何工作的,并编写与当前设计兼容的代码(因为我们不能更改当前的语言设计)。

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

代码语言:javascript
运行
复制
if (typeof b === "undefined")

或者,如果您在浏览器中,并且希望b是全局的,那么您可以使用这样的事实,即全局连接到window对象,缺少的对象属性不会像这样创建ReferenceErrors:

代码语言:javascript
运行
复制
console.log(window.b);   // undefined
票数 3
EN

Stack Overflow用户

发布于 2015-08-09 07:39:30

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

除了“这是Eich设计它的方式”之外,还有一个可能的解释是,您不需要声明对象属性。你就用它们吧。但是必须声明变量(除了http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html之外,我们现在没有严格的模式)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31901994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档