Javascript 合并二进制标志
Javascript Combine Binary Flags
我正在尝试将 javascript 二进制标志与我的 var 定义内联,但我的代码抛出异常 "Can't find variable: 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,
};
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 对象 shorthand 使它更具吸引力:
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
值的方法将适用于它,但它提供了更多您可能期望的传统枚举语义(尤其是只读的)。
我正在尝试将 javascript 二进制标志与我的 var 定义内联,但我的代码抛出异常 "Can't find variable: 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,
};
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 对象 shorthand 使它更具吸引力:
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
值的方法将适用于它,但它提供了更多您可能期望的传统枚举语义(尤其是只读的)。