Javascript结合二进制标志

时间:2015-11-12 19:24:47

标签: javascript titanium appcelerator

我正在尝试将javascript二进制标记内联到我的var定义,但是我的代码抛出异常“找不到变量:A”。有没有办法实现这个目标?

var flag = {
    A: 1,
    B: 2,
    C: 4,
    D: 8,
    All: A | B | C | D,
};

1 个答案:

答案 0 :(得分:6)

在您仍然声明包含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,请尝试使用this answer来声明枚举。上面创建All值的方法可以使用它,但它提供了更多你可能期望的传统枚举语义(特别是只读)。