我有一个收到错误的用户
TypeError: a is undefined
我很困惑这是怎么回事。不会尝试访问未定义的变量抛出引用错误?在什么情况下会抛出类型错误?
答案 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
。
CheckObjectCoercible
在section 9.10
抽象操作CheckObjectCoercible如果其参数是无法使用ToObject转换为Object的值,则会引发错误。它由表15定义:
我们可以在表15中看到,TypeError
和undefined
值会引发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