我正在循环一个内部属性并不完全一致的大对象。但是,当我在对象周围抛出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}
如果我在创建对象内容后打印它们,它们看起来很好。那么邪恶力量在这里有什么作用?感谢。
答案 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
属性”
pendingTripDropoffMarkers
或pendingTripDropoffMarkers[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) {...}