未定义的变量如何抛出类型错误?

时间:2014-07-30 18:25:43

标签: javascript

我有一个收到错误的用户

TypeError: a is undefined

我很困惑这是怎么回事。不会尝试访问未定义的变量抛出引用错误?在什么情况下会抛出类型错误?

2 个答案:

答案 0 :(得分:4)

正如@jgillich在回答中指出的那样,以下代码在TypeError对象上产生undefined

> a
ReferenceError: a is not defined
> var a;
> a.x
TypeError: a is undefined

要了解原因,我们可以参考ECMAScript 5.1规范部分11.2.1 Property Accessors。我们对第5步感兴趣

  

5。调用CheckObjectCoercible( baseValue )。

在我们的示例中, baseValue 是引用a的值。这意味着 baseValue undefined

CheckObjectCoerciblesection 9.10

中定义
  

抽象操作CheckObjectCoercible如果其参数是无法使用ToObject转换为Object的值,则会引发错误。它由表15定义:

我们可以在表15中看到,TypeErrorundefined值会引发null

因此,我们之所以拥有TypeError而不是ReferenceError,是因为规范是这样说的!

还有其他方法可以在TypeError上获得undefined,特别是ToObject也会为TypeError投放undefined

这三行代码产生TypeError: can't convert undefined to object

Object.defineProperties({}, undefined);
Object.prototype.toLocaleString.call(undefined);
Object.prototype.valueOf.call(undefined);

虽然这次信息有点清楚。

也可以直接在undefined上调用TypeError: undefined has no properties

undefined.foo();
undefined.x;

所有这些都是使用Firefox 33.0a2(Aurora)测试的。

答案 1 :(得分:2)

> a
ReferenceError: a is not defined
> var a;
> a.x
TypeError: a is undefined