Javascript组合二进制标志
我试图将javascript二进制标志与我的var定义内联,但我的代码抛出了一个异常“找不到变量:A”。有没有办法做到这一点Javascript组合二进制标志,javascript,titanium,appcelerator,Javascript,Titanium,Appcelerator,我试图将javascript二进制标志与我的var定义内联,但我的代码抛出了一个异常“找不到变量:A”。有没有办法做到这一点 var flag = { A: 1, B: 2, C: 4, D: 8, All: A | B | C | D, }; 在声明包含A的对象时,不能使用A 如果要使用这些值,需要稍后声明(或初始化)All字段,如下所示: var flag = { A: 1, B: 2, C: 4, D: 8, };
var flag = {
A: 1,
B: 2,
C: 4,
D: 8,
All: A | B | C | D,
};
在声明包含
A
的对象时,不能使用A
如果要使用这些值,需要稍后声明(或初始化)All
字段,如下所示:
var flag = {
A: 1,
B: 2,
C: 4,
D: 8,
};
flag.All = flag.A | flag.B | flag.C | flag.D;
或者,您可以使用函数作为范围来封装变量,并执行以下操作:
var flag = (function () {
var A = 1, B = 2, C = 4, D = 8;
return {A: A, B: B, C: C, D: D, All: A|B|C|D};
}());
ES6对象速记使其更具吸引力:
var flag = (function () {
var A = 1, B = 2, C = 4, D = 8;
return {A, B, C, D, All: A|B|C|D};
}());
如果All
是您的常见模式,则可以生成:
flag.All = Object.keys(flag).reduce(function (p, c) {
return p | flag[c];
}, 0);
使用ES6,您还可以缩短时间:
flag.All = Object.keys(flag).reduce((p, c) => (p | flag[c]), 0);
如果ES6对您可用,请尝试声明枚举。上述创建
All
值的方法可以使用它,但它提供了更多您可能期望的传统枚举语义(尤其是只读的)。在声明包含A
的对象时,不能使用A
如果要使用这些值,需要稍后声明(或初始化)All
字段,如下所示:
var flag = {
A: 1,
B: 2,
C: 4,
D: 8,
};
flag.All = flag.A | flag.B | flag.C | flag.D;
或者,您可以使用函数作为范围来封装变量,并执行以下操作:
var flag = (function () {
var A = 1, B = 2, C = 4, D = 8;
return {A: A, B: B, C: C, D: D, All: A|B|C|D};
}());
ES6对象速记使其更具吸引力:
var flag = (function () {
var A = 1, B = 2, C = 4, D = 8;
return {A, B, C, D, All: A|B|C|D};
}());
如果All
是您的常见模式,则可以生成:
flag.All = Object.keys(flag).reduce(function (p, c) {
return p | flag[c];
}, 0);
使用ES6,您还可以缩短时间:
flag.All = Object.keys(flag).reduce((p, c) => (p | flag[c]), 0);
如果ES6对您可用,请尝试声明枚举。上面创建
All
值的方法可以使用它,但它提供了更多您可能期望的传统枚举语义(尤其是只读的)。这不是您的数学问题,而是您如何声明事物的问题。在声明包含A
的对象时,不能使用A
。这不是数学问题,而是如何声明的问题。在声明包含A
的对象时,不能使用A
。回答得很好。我没有全部试过。第一个可以工作,但当我有许多标志和描述性名称时,它会变长。喜欢减少选项!这是我将添加到工具箱中的一个。谢谢,回答得很好。我没有全部试过。第一个可以工作,但当我有许多标志和描述性名称时,它会变长。喜欢减少选项!这是我将添加到工具箱中的一个。谢谢