为什么读取属性有时会在javascript中引发错误?

克里斯

假设我有一些变量:

var s = 's', i = 0, o = {}, a = [], n = null, nan = NaN, u;

我如何理解何时读取x.p将返回undefined以及何时将抛出TypeError

s.p;  // undefined
i.p;  // undefined
o.p;  // undefined
a.p;  // undefined
n.p;  // TypeError!
nan.p;  // undefined
u.p;  // TypeError!

PS是nullundefined也是唯一以这种方式产生的怪异值吗?还有其他吗?

编辑

我知道,通过像我一样声明变量,我的一些值已被对象(例如Number自动包装,尽管它们是原始的。因此,我可以像对待“正确”的对象(例如{}[]),并试图读取它们的属性。但是我找不到太多解释这种方式包装的内容。

贝吉

是的,null并且undefined是在属性访问中使用时唯一引发异常的值。点和括号属性访问器确实会调用内部CheckObjectCoercible函数,该函数定义如下:

抽象操作CheckObjectCoercible如果它的参数是这样的值,引发错误不能被转换为对象使用ToObject由表15定义:

Table 15 — CheckObjectCoercible Results
Argument Type | Result
--------------+------------------
Undefined     | Throw a TypeError exception.
Null          | Throw a TypeError exception.
Boolean       | Return
Number        | Return
String        | Return
Object        | Return

null并且undefined作为表示Nothing的值不能转换为对象(如您所说的“包装”)。请注意,您当然可以拥有一个具有现有属性的对象,该对象会引发访问,例如

var o = {get p() { throw new TypeError("you may not access this"); }};
o.p // TypeError

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么pastespecial方法有时会引发错误1004而其他时候却不会呢?

为什么有时会在终端中反复提示“>”?

为什么Relation.size有时会在Rails 4中返回哈希

为什么close_fds = False有时会在Python 2中挂起进程?

为什么导航属性有时会返回null?

为什么在Java Servlet中的会话中设置属性有时会失败?

为什么有时会忽略 flexbox 中的纵横比 CSS 属性?

为什么在 javascript 中执行导入时,有时会返回未定义的变量?

为什么在Java 8中split有时会在结果数组的开头删除空字符串?

为什么 C# 单例类有时会在多线程中调用两个方法?

为什么打印char有时会在C中打印4个字节的数字

为什么Eclipse CDT代码格式化程序有时会在模板参数中引入空格?

为什么我有时会得到嵌入的属性有时不会?

在没有打开Office的情况下,“ OfficeClickToRun.exe”有时会引发错误

为什么农作物有时会在分类栅格上引入NA?

为什么PyQt有时会在退出时崩溃?

为什么浏览器有时会在进入HTTPS页面时要求确认?

为什么我的 VBA 程序有时会在调试模式下停止?

为什么 index 有时会在 reduce() 方法中意外运行?

为什么我的 Ubuntu 20.04 安装有时会在启动时挂起?

为什么 next() 有时会在生成器上隐式调用?

为什么Ruby Procs有时会返回而有时却是错误?

为什么转换测量会在 swift 中引发错误?

为什么模块在本地导入时有时会引发UnboundLocalError?

为什么我的函数有时会引发访问冲突?

为什么 ObjectSpace._id2ref 有时会引发 RangeError?

为什么Java的Regex有时会引发stackoverflow异常?

为什么函数体中的冒号不会在JavaScript中引发错误?

为什么以“->”开头的行不会在Javascript中引发错误?