为什么简单的JS未定义检查会触发错误?

时间:2012-01-27 00:14:12

标签: javascript javascript-objects

我正在循环一个内部属性并不完全一致的大对象。但是,当我在对象周围抛出if(typeof){}语句时,它仍然会触发错误:

声明

if (typeof pendingTripDropoffMarkers[i].trip.id !== "undefined") {// do stuff}

错误

Uncaught TypeError: Cannot read property 'trip' of undefined

捕获

然而,坐在具有相同范围的相同函数中的姐妹对象就可以了。

if (typeof pendingTripPickupMarkers[i].trip.id !== "undefined") {// do stuff}

如果我在创建对象内容后打印它们,它们看起来很好。那么邪恶力量在这里有什么作用?感谢。

3 个答案:

答案 0 :(得分:3)

您应该测试任何可能未定义的对象。

if (pendingTripDropoffMarkers[i] 
       && pendingTripDropoffMarkers[i].trip
       && pendingTripDropoffMarkers[i].trip.id !== undefined) {

如果您真的担心undefined被覆盖,请不要执行typeof黑客攻击。只需使用undefined运算符即可获得新的void

if (pendingTripDropoffMarkers[i] 
       && pendingTripDropoffMarkers[i].trip
       && pendingTripDropoffMarkers[i].trip.id !== void 0) {

如果您确定应该定义pendingTripDropoffMarkers[i],那么某处还会出现其他问题。

答案 1 :(得分:2)

它告诉你pendingTripDropoffMarkers[i]未定义,因为它“无法读取 undefined trip属性”

pendingTripDropoffMarkerspendingTripDropoffMarkers[i]无效是不正确的。实际上,这两个命题几乎都是假的。至少pendingTripDropoffMarkers必须先定义,而不是null,因为它不会抱怨将某个对象索引。如果pendingTripDropoffMarkers[i]为null,则错误将类似于“无法读取 null 的trip属性”,而不是“无法读取 undefined ”的trip属性< / p>

另一方面,如果i超出pendingTripDropoffMarkers数组的范围,则pendingTripDropoffMarkers[i]将不确定。所以,如果确实被定义为数组,我会打赌就是这样。

这并不意味着它是真的!你仍然可以做出奇怪的事情,比如

var myarray = [undefined,2];

在这种情况下myarray[0]将是未定义的,并且尝试从trip获取该错误将会得到相同的错误。但这是一个非常奇怪的案例。

答案 2 :(得分:1)

如果pendingTripDropoffMarkers[i]为空,您将收到错误消息。即,在测试 数组元素之前,你没有检查数组元素是否存在...

为了便于阅读,我通常会执行以下操作:

var currentElement = pendingTripDropoffMarkers[i],
    elementExists  = currentElement != null,
    hasId          = elementExists && currentElement.trip && currentElement.trip.id

if (elementExists && hasId) {...}