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

125*_*748 5 javascript

我有一个用户正在收到错误

TypeError: a is undefined
Run Code Online (Sandbox Code Playgroud)

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

dee*_*see 4

正如 @jgillich 在他的回答中指出的,以下代码TypeErrorundefined对象上生成 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。这意味着baseValueundefined

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) 进行了测试。