[英]in javascript, is there syntatic shortcut checking existence of each layer of embedded object?
例如,下面的代码
if( obj.attr1.attr2.attr3.attr4 == 'constant' ) return;
需要重写为
if( obj.attr1 && obj.attr1.attr2 && obj.attr1.attr2.attr3 && obj.attr1.attr2.attr3.attr4 == 'constant' ) return;
我是否正确,因为每一层都需要单独测试,还是有一个语法捷径?
如果这是一次性的,那将不是问题,但是这种结构渗透到我的代码中。
从答案中,这是我在现场的解决方案:
try{ if( obj.attr1.attr2.attr3.attr4 != 'const' ) throw 'nada'; } catch(e){ nonblockAlert( 'Relevant Message' ); return; };
这是有效的,因为由于 attr 不存在而引发的错误被本地 throw() 捕获。 问题是语法不适合正常的 if then else 控制。
没有真正的捷径。 您可以编写一个帮助程序 function 来为您做这件事,可以浓缩为:
function getProp(obj){
var i=0, l=arguments.length;
while(i<l && (obj = obj[arguments[i++]]));
return obj;
}
if( getProp(obj, 'attr1', 'attr2', 'attr3', 'attr4') == 'constant')
或者你可以这样做:
var tmp;
if((tmp = obj.attr1)
&& (tmp=tmp.attr2)
&& (tmp=tmp.attr3)
&& (tmp.attr4 == 'constant')) {
有趣的问题 - 虽然我自己从来没有遇到过这个问题。 我能想到的最好的选择是写一个助手 function:
function get(chain, context) {
var o = arguments.length == 2 ? context : window,
c = chain.split('.');
for (var i = 0; i < c.length; i++) {
if (!o) return null;
o = o[c[i]];
}
return o;
}
如果obj
是全局的,那么您可以执行以下操作:
if (get('obj.attr1.attr2.attr3.attr4') == 'constant') return;
否则:
if (get('attr1.attr2.attr3.attr4', obj) == 'constant') return;
正如人们提到的,但没有人这样做,您可以使用 try/catch:
try {
if(obj.attr1.attr2.attr3.attr4 == 'constant') return;
} catch(e) {}
它不是有史以来最好的代码,但它是最简洁且易于阅读的。 避免它的最好方法是不要将可能不存在的对象树嵌套得如此之深。
不,不幸的是,没有使用try/catch
。 但是,您可以为自己编写一个助手 function (未经测试,但概念就在那里):
function existsAndEquals(obj, layers, compare) {
for (var i = 0; i < layers.length; i++)
if (!(obj = obj[layers[i]]))
return false;
return obj == compare;
}
if (existsAndEquals(obj, ['attr1', 'attr2', 'attr3', 'attr4'], 'constant'))
// ...
您可以使用调用(或应用)将字符串评估的上下文从 window 转移到任何 object
function getThis(string){
var N= string.split('.'), O= this[N.shift()];
while(O && N.length) O= O[N.shift()];
return O;
}
window.obj={
attr1:{
attr2:{
attr3:{
attr4: 'constant!'
}
}
}
}
getThis('obj.attr1.attr2.attr3.attr4');
/* 返回值: (String) '常量! ' */
getThis.call(obj, 'attr1.attr2.attr3.attr4');
/* 返回值: (String) '常量! ' */
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.