为什么在switch语句内分支时为什么需要对位字段执行按位与运算

时间:2019-03-01 10:13:09

标签: javascript typescript bitmask

我不太理解为什么我们需要在下面的代码中按AND逐位应用BindingFlags.Types

switch (binding.flags & BindingFlags.Types) {
    case BindingFlags.TypeElementAttribute:
      setElementAttribute(view, binding, renderNode, binding.ns, name, value);
      break;
    case BindingFlags.TypeElementClass:
      setElementClass(view, renderNode, name, value);
      break;
    case BindingFlags.TypeElementStyle:
      setElementStyle(view, binding, renderNode, name, value);
      break;
    case BindingFlags.TypeProperty:
      const bindView = (def.flags & NodeFlags.ComponentView &&
                        binding.flags & BindingFlags.SyntheticHostProperty) ?
          elData.componentView :
          view;
      setElementProperty(bindView, binding, renderNode, name, value);
      break;
  }

这里是BindingFlags的定义:

export const enum BindingFlags {
  TypeElementAttribute = 1 << 0,
  TypeElementClass = 1 << 1,
  TypeElementStyle = 1 << 2,
  TypeProperty = 1 << 3,
  SyntheticProperty = 1 << 4,
  SyntheticHostProperty = 1 << 5,
  CatSyntheticProperty = SyntheticProperty | SyntheticHostProperty,

  // mutually exclusive values...
  Types = TypeElementAttribute | TypeElementClass | TypeElementStyle | TypeProperty
}

有人可以澄清吗?

1 个答案:

答案 0 :(得分:1)

  

我不太了解为什么我们需要通过下面的代码中的BindingFlags.Types应用逻辑AND:

这是一个按位 AND(&),而不是一个逻辑(&&)。

您需要使用它来过滤掉其他位(例如SyntheticProperty)。 BindingFlags.Type仅包含TypeXYZ位。

例如,如果binding.flags同时具有SyntheticProperty(0b00010000)和TypeElementClass(0b00000010),则其值为0b00010010。由于switch仅需要匹配类型的标志,因此它使用BindingFlags.Types&(0b00001111)掩盖非类型的值。 0b00010010&0b00001111是0b0001000,因此它与SyntheticProperty大小写匹配。