web-dev-qa-db-ja.com

JavaScript「未定義のプロパティ「バー」を読み取れません」

3つのパラメーターを取る関数があります。私が持っている問題は、パラメータの1つがオブジェクトの時々未定義の値のプロパティであるということです(つまり、thing.foo.bar、およびthing.fooを取ります未定義であるため、bar)にアクセスできません。

これを回避する方法は何ですか?関数の宣言内には、条件付きチェックif (!parameterName)がありますが、ブラウザー(Chrome)は未定義のbarプロパティを読み取れないというエラーをまだスローしています。

26
Connor

オブジェクトのプロパティが他のオブジェクトを参照する場合、そのプロパティを使用する前に、未定義のthatをテストできます。

if (thing && thing.foo)
   alert(thing.foo.bar);

実際のコードを表示する場合は、状況をより適切に反映するように回答を更新できますが、おそらく次のようなものです。

function someFunc(parameterName) {
   if (parameterName && parameterName.foo)
       alert(parameterName.foo.bar);
}
38
nnnnnn

複合チェック:

   if (thing.foo && thing.foo.bar) {
      ... thing.foor.bar exists;
   }
9
Marc B

次の2つの方法のいずれかを保護できます。

function myFunc(thing) {
    if (thing && thing.foo && thing.foo.bar) {
        // safe to use thing.foo.bar here
    }
}

function myFunc(thing) {
    try {
        var x = thing.foo.bar;
        // do something with x
    } catch(e) {
        // do whatever you want when thing.foo.bar didn't work
    }
}

最初の例では、参照している変数のすべての可能な要素を明示的にチェックして、使用する前に安全であることを確認して、予定外の参照例外が発生しないようにします。

2番目の例では、例外ハンドラーを囲みます。存在する場合は、thing.foo.barにアクセスするだけです。存在する場合、コードは正常に実行されます。存在しない場合は、キャッチして無視する例外をスローします。最終結果は同じです。 thing.foo.barが存在する場合、それを使用するコードが実行されます。存在しない場合、そのコードは実行されません。すべての場合において、関数は正常に実行されます。

ifステートメントの実行は高速です。例外はコーディングが簡単で、保護することが可能な多くの可能性がある複雑なケースで使用でき、コードが構造化されているため、例外のスローと処理は、データの一部が存在しないときに実行をスキップするクリーンな方法です。例外がスローされると、例外は少し遅くなります。

7
jfriend00

関数に渡す前に確認してください。だからあなたは合格します:

thing.foo ? thing.foo.bar : undefined
6
Petar Ivanov