为什么我们需要在 switch 语句中分支时对位字段执行按位与

Why do we need to perform bitwise AND to a bit field when branching inside a switch statement

我真的不明白为什么我们需要在下面的代码中通过 BindingFlags.Types 按位应用 AND:

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
}

有人可以澄清一下吗?

I don't really understand why we need to apply logical AND by BindingFlags.Types in the code below:

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

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

例如,如果binding.flags同时具有SyntheticProperty(0b00010000)和TypeElementClass(0b00000010),则其值为0b00010010。由于 switch 只需要匹配类型的标志,它使用 BindingFlags.Types (0b00001111) 和 & 来屏蔽非类型值。 0b00010010 & 0b00001111 是 0b0001000,所以它符合 SyntheticProperty 的情况。