繁体   English   中英

在 javascript 中,是否存在嵌入式 object 每一层的语法快捷方式检查?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM