我有一个用户正在收到错误
TypeError: a is undefined
Run Code Online (Sandbox Code Playgroud)
我很困惑这是怎么发生的.不会尝试访问未定义的变量抛出引用错误?在什么情况下它会抛出类型错误?
正如 @jgillich 在他的回答中指出的,以下代码TypeError在undefined对象上生成 a 。
> a
ReferenceError: a is not defined
> var a;
> a.x
TypeError: a is undefined
Run Code Online (Sandbox Code Playgroud)
要了解原因,我们可以参考 ECMAScript 5.1 规范第 11.2.1 属性访问器部分。我们对第 5 步感兴趣
5. 调用CheckObjectCoercible( baseValue )。
在我们的示例中,baseValue是引用的值a。这意味着baseValue是undefined。
CheckObjectCoercible定义见第 9.10 节
如果抽象操作 CheckObjectCoercible 的参数是无法使用 ToObject 转换为对象的值,则会引发错误。它的定义如表 15 所示:
我们可以在表 15 中看到,a为和值TypeError抛出。undefinednull
所以我们之所以用 aTypeError而不是 a ReferenceError,和往常一样,是因为规范是这么说的!
还有其他方法可以获取TypeErroron undefined,值得注意的是 ToObject还会抛出TypeErrorfor undefined。
这三行代码产生TypeError: can't convert undefined to object:
Object.defineProperties({}, undefined);
Object.prototype.toLocaleString.call(undefined);
Object.prototype.valueOf.call(undefined);
Run Code Online (Sandbox Code Playgroud)
不过这一次的信息更加明确了。
也直接调用undefinedProduceTypeError: undefined has no properties
undefined.foo();
undefined.x;
Run Code Online (Sandbox Code Playgroud)
所有这些都使用 Firefox 33.0a2 (Aurora) 进行了测试。
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |