我觉得这一定是重复的,但我一直找不到任何东西,可能是由于措辞不同,或者只是因为没有更好的东西。
我正在生成大量的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
整数而不是布尔值,我不想添加另一行带有双重否定的行来重新键入布尔值。
使用直觉我也试过||=
,这没有帮助:)
有没有更好(更短)的方法来编写这些命令?
注意:我无法使用循环处理命令,因为命令不会一次全部执行,而是在其余代码中以小块的形式传播(为简单起见省略了) )。
答案 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);