2012-01-27 10 views
1

内部プロパティがすべて一貫していない大きなオブジェクトをループしています。私はオブジェクトの周囲if(typeof){}文を投げるときしかし、それはまだエラーをトリガです:シンプルなJSの未定義チェックでエラーが発生するのはなぜですか?

声明

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

エラー

Uncaught TypeError: Cannot read property 'trip' of undefined 

キャッチ

H間違いなく同じ機能を持つ姉妹のオブジェクトと同じスコープのはうまくいきます。

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

作成したオブジェクトの内容を印刷しても、うまく見えます。だからここに邪悪な力があるの?ありがとう。

+0

オブジェクトプロパティの解決にスコープは関係しません。スコープは変数(識別子)の解決に関するもので、オブジェクトのプロパティはオブジェクトとその内部プロトタイプチェーンで解決されます。 – RobG

答えて

3

あなたはどんなをテストする必要があります未定義の可能性があるオブジェクト。

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

あなたはundefinedが上書きさについては本当に心配している場合は、typeofハックをしません。 void演算子を使用して新鮮なundefinedを取得してください。

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

あなたはpendingTripDropoffMarkers[i]が定義されるべきであることを特定している場合は、他のいくつかの問題がどこかにあります。それはpendingTripDropoffMarkersまたはpendingTripDropoffMarkers[i]がnullであることを必ずしも真実ではない

未定義tripプロパティを読み取ることができません」ので、

+0

これを指摘してくれてありがとうより高いレベルのオブジェクトは未定義でした! – crockpotveggies

1

pendingTripDropoffMarkers[i]がnullの場合、エラーが発生します。配列要素がにおける配列要素のものをテストする前に存在している場合つまり、あなたは、私は通常、読みやすくするために、以下のような何かを...

をチェックされていません。

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

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

'elementExists'テストに'!= 'を使用しましたか?あなたは現在厳格なテストを行っていますので、 '!== null'ならまだ' undefined'となるでしょう –

+1

それは本当です。それを指摘してくれてありがとう....だから私は ' ;)彼はちょうど 'elementExists = currentElement'をやっているのは、彼が気にしていたのは真実であるということだけでした。 – hvgotcodes

+0

ここで問題となっているのは、currentElementがエラーを引き起こしていて、おそらくそのtrip.idにアクセスしているからです。私はこの問題を解決することができませんでしたが、私はこれを他の関数で試してみたいので、これを覚えています。 – crockpotveggies

2

pendingTripDropoffMarkers[i]が未定義であることを知らせるています。確かに、両方の命題はほとんど間違いです。少なくともpendingTripDropoffMarkersは、あらかじめ定義しておく必要があります。ヌルではありません。なぜなら、オブジェクトからインデックスを取得することについて不平を言わないからです。 pendingTripDropoffMarkers[i]がnullだった場合、エラーは一方で、iは外で、場合

未定義の旅のプロパティを読み取ることができない」ではなく、「ヌルの旅のプロパティを読み取ることができません」のようなものになるだろうpendingTripDropoffMarkers配列の範囲では、pendingTripDropoffMarkers[i]は未定義です。実際に配列として定義されていれば、そうだと思います。

それはそれが本当だとは限りません!あなたはまだその場合myarray[0]は未定義になり

var myarray = [undefined,2]; 

のような奇妙なものを作ると、同じエラーになるだろうというのオフtripを取得しようとすることができます。しかし、それは非常に奇妙なケースです。

+1

おそらく珍しいかもしれませんが、奇妙ではありません。 '[,, 2,3]'は長さ4の配列を作成しますが、 '0'と' 1'のインデックスのメンバーは存在せず、アクセスしようとしていますそれらは* undefined *を返します、それらは全く存在しません(例えば、 'array.hasOwnProperty( '0')'は* false *を返します)。 – RobG

+0

これは奇妙なオブジェクトですが、私は奇妙な未定義のケースをテストしました。明らかに、これが起こっているエッジケースがあるからです。だからあなたの答えは大きな絵を解決しないが、あなたは将来の問題から私を救った:) – crockpotveggies

+0

@ JayC:誰かが「ヌル」と主張した? –

関連する問題