假设我有一些变量:
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是null
,undefined
也是唯一以这种方式产生的怪异值吗?还有其他吗?
编辑
我知道,通过像我一样声明变量,我的一些值已被对象(例如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] 删除。
我来说两句