为什么在 javascript 中引用对象的不存在的属性不会返回引用错误?

IT技术 javascript
2021-02-24 11:49:47

如果我尝试引用一个不存在的变量,我会在 JavaScript 中得到 ReferenceError。为什么引用不存在的对象属性会返回“未定义”?这是一些代码,前提是我在浏览器中编写它:

alert(a);
ReferenceError: a is not defined //error is thrown
alert({}.a)
undefined //no error
1个回答

这就是语言的工作方式。它的基于对象的方法非常灵活,您可以在运行时动态地从对象中添加、更新和删除属性。访问当前不存在的应该产生undefined而不是引发异常。例如,这允许检查单个表达式中的存在和类型:

if (prop in obj && typeof obj[prop] == "function") obj[prop]();
// can be written shorter:
if (typeof obj[prop] == "function") obj[prop]();

您可以在不使用它的情况下获取该值。undefined在大多数情况下使用then 会抛出异常。

相反,变量在其作用域内静态声明。访问未声明的变量总是一个错误,这使得抛出ReferenceErrors是合法的。

请注意,“ReferenceError”仅存在于严格模式中。严格模式中的更改摘要在附件 C 中严格模式限制不可解析的引用。对象属性不是不可解析的引用。
2021-05-06 11:49:47
为此,我建议阅读ECMAScript 规范,特别是关于对象的 8.6、8.7 和 8.12 节,关于运算符的 11.2.1 和 11.4.1,以及关于变量和作用域的 10[.2] 节。然而,规范没有解释为什么,它只是说明了什么
2021-05-16 11:49:47
谢谢,但我知道这一切。我对“幕后”过程很感兴趣,例如为什么您可以使用delete运算符删除自定义对象的属性,而不能删除变量和函数。
2021-05-17 11:49:47