Javascript简写或操作

时间:2014-04-30 16:49:10

标签: javascript

我觉得这一定是重复的,但我一直找不到任何东西,可能是由于措辞不同,或者只是因为没有更好的东西。

我正在生成大量的JS代码,其中" ORs"具有变量的对象属性,而标识符不一定匹配。它看起来像这样(值是布尔值):

a.borderline = a.borderline || borderline;
a.st1 = a.st1 || st;
a.ref64 = a.ref64 || ref;
a.unfortunatelySometimesQuiteLongIndentifier123 = a.unfortunatelySometimesQuiteLongIndentifier123 || unfortunatelySometimesQuiteLongIndentifier;
...

为了让它更瘦,我尝试了类似

的东西
a.st1 |= st;

但是它使a.st1整数而不是布尔值,我不想添加另一行带有双重否定的行来重新键入布尔值。

使用直觉我也试过||=,这没有帮助:)

有没有更好(更短)的方法来编写这些命令?

注意:我无法使用循环处理命令,因为命令不会一次全部执行,而是在其余代码中以小块的形式传播(为简单起见省略了) )。

2 个答案:

答案 0 :(得分:3)

不,javascript中没有简写的OR运算符。但是,Coffeescript确实提供||=?=来支持this idiom

  

有没有更好(更短)的方法来编写这些命令?

在您的情况下,您正在修改a对象而不是分配给变量。您可以循环方式执行此操作:

function amendWith(target, source)
    for (var p in source)
        if (!target[p])
            target[p] = source[p];
    return target;
}

amendWith(a, {
    borderline: borderline,
    st1: st,
    ref64: ref,
    unfortunatelySometimesQuiteLongIndentifier123: unfortunatelySometimesQuiteLongIndentifier
    …
});

答案 1 :(得分:1)

我不确定这是否更短,但作为另一种想法,您可以将OR逻辑放在一个函数中,然后遍历您的值。

function myFunctionName(value1, value2) {
  return value1 || value2;
}

//names are property names of object 'a' that you want to set, values are the alternate (default) values
var myMapping = {borderline:borderline, st1:st, reallyLongName123:reallyLongName}; 

for (temp in myMapping) {
  a.temp = myFunctionName(a[temp], myMapping[temp]);
}

由于您无法使用循环且未提前知道所有值,因此您可以尝试将该函数添加到对象'a'

a.test = function(propName, otherValue) {
  this[propName] = this[propName] || otherValue;
};

a.test("borderline", borderline);