Javascript 未定义的变量如何引发类型错误?

Javascript 未定义的变量如何引发类型错误?,javascript,Javascript,我有一个用户正在获取错误 TypeError: a is undefined 我不明白这怎么会发生。尝试访问未定义的变量不会引发引用错误吗?在什么情况下它会抛出类型错误?正如@jgillich在他的回答中指出的,下面的代码在未定义的对象上生成类型错误 > a ReferenceError: a is not defined > var a; > a.x TypeError: a is undefined > a ReferenceError: a is not def

我有一个用户正在获取错误

TypeError: a is undefined

我不明白这怎么会发生。尝试访问未定义的变量不会引发引用错误吗?在什么情况下它会抛出类型错误?

正如@jgillich在他的回答中指出的,下面的代码在
未定义的
对象上生成
类型错误

> a
ReferenceError: a is not defined
> var a;
> a.x
TypeError: a is undefined
> a
ReferenceError: a is not defined
> var a;
> a.x
TypeError: a is undefined
要了解原因,我们可以参考ECMAScript 5.1规范部分。我们对步骤5感兴趣

五,。调用CheckObjectImprovalible(baseValue)

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

checkObjectImprovalible
在中定义

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

我们可以在表15中看到,对于
undefined
null
值,抛出了
TypeError

因此,我们使用
TypeError
而不是
ReferenceError
的原因和往常一样,是因为规范这么说

未定义的
上还有其他方法可以获得
类型错误
,尤其是对于
未定义的
,也会抛出
类型错误

这三行代码生成
TypeError:无法将未定义的转换为对象

Object.defineProperties({}, undefined);
Object.prototype.toLocaleString.call(undefined);
Object.prototype.valueOf.call(undefined);
虽然这一次的信息更加清晰

undefined
上直接调用会产生
TypeError:undefined没有属性

undefined.foo();
undefined.x;

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

什么浏览器?Chrome给了我“TypeError:无法读取未定义的属性'x'”编辑:在FireFoxAh中得到它。酷。非常感谢。为什么它不会抛出引用错误?@thomas See@Vache你知道为什么它会抛出引用错误吗?@KyleNeedham为什么错误会说它无法读取未定义的
x
。它听起来好像
x
是属性的对象是未定义的。可能你试着调用
a
。如果未定义,则会出现类型错误。给我们看看抛出这个的代码@贝吉,我希望我能看到它。我没有访问该代码的权限;它来自另一个团队。我刚刚看到一封电子邮件,上面说用户正在接收,这真的激起了我对可能导致它的情况的好奇心。