醜い、厄介な、恐ろしい方法は、またはのいずれeval
かを使用することtry..catch
です。より堅牢な方法は、次を使用することtypeof
です。
if (typeof foo != 'undefined' && foo !== Null &&
typeof foo.bar != 'undefined' && foo.bar !== Null &&
...
) {
// stuff
}
ただし、最終的なプロパティが 以外の値を持つ場合にのみ機能しますundefined
(つまり、プロパティが存在するが未定義の値を持つ場合は失敗します)。
より正確なジェネリック プロパティ テスターを作成して、独自のプロパティをテストできます。
function testChain(obj) {
for (var i=1, iLen=arguments.length; i<iLen; i++) {
if (obj.hasOwnProperty(arguments[i])) {
obj = obj[arguments[i]];
} else {
return false;
}
}
return true;
}
alert( testChain({a:{b:'b'}}, 'a', 'b') ); // true
ただし、継承されたプロパティはチェックされません。これらをチェックするには、 を使用できますがpropertyIsEnumerable
、列挙できないプロパティ (組み込みオブジェクトのネイティブ メソッドなど) はチェックされません。
したがって、実際には一般的な解決策はありません。特定のケースに合わせて調整することしかできません。