alert(typeof QuizParser.Parser.otherdata['response_set']['answers']["slide_" + _index]['trt']);
なんで?これは単に文字列を警告するべきではありませんundefined
か? これが間違っている場合、その変数が定義されているかどうかを確認するにはどうすればよいですか?
alert(typeof QuizParser.Parser.otherdata['response_set']['answers']["slide_" + _index]['trt']);
なんで?これは単に文字列を警告するべきではありませんundefined
か? これが間違っている場合、その変数が定義されているかどうかを確認するにはどうすればよいですか?
エラーはtypeof
、未定義の変数のプロパティにアクセスしようとしているため、とは関係ありません。QuizParser.Parser
を使用すると、未定義の変数typeof
が返さ"undefined"
れますが、実際には、を呼び出す前に他のことを行っていますtypeof
。QuizParser.Parser.otherdata
エラーを発生させないために定義する必要がtypeof
あります。たとえば、x
定義されていない場合は問題ありませんが、(何かにアクセスするために)定義されていないアクセスを試みているため、エラーが発生しtypeof(x)
ますtypeof(x.something)
x
直接的な方法を選択した場合、それはそれほど簡単ではありません。次のように書く必要があります...
if (typeof QuizParser !== 'undefined' // to check whether the variable defined or not
&& QuizParser.Whatever // if variable IS defined, we can check its property directly
&& QuizParser.Whatever.Property...
)
「中間」チェーンをスキップできないことに注意してください。プロパティが存在しない場合、未定義と評価され、次のステップで TypeError: がスローされますCannot read property ... of undefined
。
しかし、別の方法があります (多くのクロスブラウザー ライブラリでは非常に一般的です)。代わりに、例外を使用して「見つからないリンク」をキャッチします。
try {
var flag = QuizParser.Whatever.Property.You.Like['equal']['to']['something'] !== undefined;
} catch(e) {}
if (flag) { ... } // processing goes here
isset
これにより、PHP から動作をほぼエミュレートできます。flag
変数はtrue
、ターゲット オブジェクトのエンドポイント プロパティが設定されている (= not ) 場合にのみ設定されますundefined
。また、例外メカニズムを使用すると、クライアントでエラーがスローされないことが保証されます (JS の解析が完全に停止します)。
それtypeof
が問題ではありません。typeof
「typeof」部分が実際に実行される前に、nullオブジェクトのメンバーにアクセスしようとしているのは事実です。たとえば、このシナリオを考えてみましょう(JavaScriptではないことに注意してください。ただし、言語構文ではなく、私が理解しようとしているアイデアです)。
public class Test
{
public string teststring;
}
そして、あなたはこのようなことをします:
Test nullTest; // null
if(typeof(test.teststring) != null)
テスト後にパーサーがドットを確認すると、基本的にnull.teststringを呼び出そうとしているため、nullreferenceエラーがスローされます。代わりに、次のようなことを行う必要があります。
if(object != null && object.property != null && object.property.propertyOfTheProperty != null)
//...
危険なことが起こる前にifステートメントの実行が中断されるようにします。object
'sまたは'snullnessについて知ることproperty
が重要な場合は、次のこともできます。
if(object != null)
{
if(object.property != null)
{
if(object.property.propertyOfTheProperty != null)
{
//...
}
}
}