醜陋,討厭,可怕的方式是使用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
,但不會檢查非枚舉屬性(例如,內置對象的本地方法)。
所以確實沒有通用的解決方案,您只能針對特定情況定製一個解決方案。
哎呀,我什至不能這樣做? var baz = data.foo.bar.baz;如果foo未定義,那麼在該行之後的腳本中沒有任何反應。 – Stefan 2013-03-14 04:06:59
這是怎麼回事? – allenhwkim 2013-03-14 04:09:42
可以請你發佈所有'ajax()'代碼嗎? (假設它是'ajax()'...) – Jace 2013-03-14 04:11:02