我想这样做:
if(a.b.c) alert('c exists') //produces error if(a && a.b && a.b.c ) alert('c exists') //also produces ReferenceError
if(typeof(a) != "undefined" && a.b && a.b.c) alert('c exists');
或某种类似的功能……
if(exists('a.b.c')) alert('c exists'); function exists(varname){ vars=varname.split('.'); for(i=0;i<vars.length;i++){ //iterate through each object and check typeof } } //this wont work with local variables inside a function
编辑:解决方案以下
(相信Felix的这个主题,我只是稍微调整了一下
Check if object member exists in nested object)
这有效:
if (typeof a != 'undefined' && a.b && a.b.c) alert('c exists')
但我找到的最好的事情就是把它放到一个函数中.我使用了2个不同的函数,一个用于在对象中获取变量,另一个用于检查其是否设置.
/** * Safely retrieve a property deep in an object of objects/arrays * such as userObj.contact.email * @usage var email=getprop(userObj,'contact.email') * This would retrieve userObj.contact.email,or return FALSE without * throwing an error,if userObj or contact obj did not exist * @param obj OBJECT - the base object from which to retrieve the property out of * @param path_string STRING - a string of dot notation of the property relative to * @return MIXED - value of obj.eval(path_string),OR FALSE */ function getprop(obj,path_string) { if(!path_string) return obj var arr = path_string.split('.'),val = obj || window; for (var i = 0; i < arr.length; i++) { val = val[arr[i]]; if ( typeof val == 'undefined' ) return false; if ( i==arr.length-1 ) { if (val=="") return false return val } } return false; } /** * Check if a proprety on an object exists * @return BOOL */ function isset(obj,path_string) { return (( getprop(obj,path_string) === false ) ? false : true) }
解决方法
这个怎么样:
function exists(str,namespace) { var arr = str.split('.'),val = namespace || window; for (var i = 0; i < arr.length; i++) { val = val[arr[i]]; if ( typeof val == 'undefined' ) return false; } return true; }