假设我有一些变量:
var s = 's', i = 0, o = {}, a = [], n = null, nan = NaN, u;如何理解当阅读x.p TypeError**?**会返回未定义的,以及何时会抛出
s.p; // undefined
i.p; // undefined
o.p; // undefined
a.p; // undefined
n.p; // TypeError!
nan.p; // undefined
u.p; // TypeError!null和undefined是这种情况下唯一奇怪的值吗?还有其他人吗?
编辑
我知道,通过像我一样声明变量,我的一些值已经被对象(例如Number)自动包装,尽管它是原语。因此,我可以将它们视为“适当”对象(例如{}、[]),并尝试读取它们的属性。但我找不到多少解释什么是和不是这样包装。
发布于 2014-05-15 20:10:43
是的,null和undefined是在属性访问中使用时抛出异常的唯一值。点和括号property accessors调用内部CheckObjectCoercible function,定义如下:
如果抽象操作
CheckObjectCoercible的参数是不能使用ToObject转换为对象的值,则会引发错误。表15对此作了定义: 表15 - CheckObjectCoercible结果参数类型抛出一个TypeError异常。布尔值,返回数字,返回字符串,返回对象,返回
null和undefined是不代表任何东西的值,不能转换为对象(正如您所说的“包装”)。请注意,您当然可以拥有一个具有现有属性的对象,该属性在访问时抛出,如
var o = {get p() { throw new TypeError("you may not access this"); }};
o.p // TypeError发布于 2014-05-15 19:44:47
当你读一些未定义的东西的属性时。你是在说:
什么是未定义的?或者在空的情况下,什么是空的未定义的?未定义或null都不是对象,因此不能在它们上设置或获取属性。记住这一点,就会抛出一个错误。
发布于 2014-05-15 19:46:35
当对象为空/未定义时,它将抛出一个错误,因为将尝试访问一个首先不存在于中的对象的属性。
在其他情况下,它将尝试访问现有对象的属性,并返回未定义的属性,因为找不到该属性。
请注意,js中的几乎所有东西都是一个对象,您可以看到here。
https://stackoverflow.com/questions/23687233
复制相似问题