JavaScript 中的按位运算符作为状态标志

Bitwise operators in JavaScript as flags on a state

我正在尝试将一些逻辑安装到我正在处理的一段 JS 中,它将根据某些条件简单地 add/remove 标记。

主要分为两步

  1. 根据一些有状态数据构建对象
  2. 交给post初始化方法来解析对象的数据数组

Step 1中,有一个'status'属性,可以有多个flags:

  - INCOMPLETE      = 1
  - COMPLETE        = 2
  - CURRENT         = 4
  - NOT_APPLICABLE  = 8

解析对象数组时,它会检查每个项目以查看设置了哪些状态标志:

  if CURRENT is set, give class 'item-current' to node
  if INCOMPLETE is set, give class 'item-incomplete' to node
  if COMPLETE is set, give class 'item-complete' to node
  if NOT_APPLICABLE is set, give class 'item-not-applicable' to node

当用户与页面交互时,对象数组上的标志将发生变化 - 当用户 'completes' 一个段时,该对象 属性 的状态将删除 INCOMPLETE 标志,并添加 COMPLETE 标志。

我试过这样做:

   let v = [
       {
         name: "Item 1",
         status: COMPLETE
       },
       {
         name: "Item 2",
         status: INCOMPLETE | CURRENT
       },
       {
         name: "Item 3",
         status: INCOMPLETE
       }
   ];

   // Moving on to step 3

   v[1].status = v[1].status ^ INCOMPLETE ^ CURRENT | COMPLETE; // remove incomplete and current from Item 2, marking as COMPLETE
   v[2].status = v[2].status | CURRENT;  // marks Item 3 as current step, but not yet complete

在上述场景中,Item 1 已完成,用户已转到 Item 2,这仍然是未完成的当前步骤。出于某种原因,当我评估标志的条件时,它给了我(看起来)意外的行为。

我尝试通过执行以下操作删除标志: v[1].status ^= CURRENT v[1].status = v[1].status ^ CURRENT

并比较:

if ((v[1].status & COMPLETE) === COMPLETE) {
  // is complete
} else {
  // not complete
}

但我似乎仍然面临着旗帜,这些旗帜似乎仍在设置,或者出乎意料地设置。有更简单的方法吗?

期望的结果是我可以设置标志、删除标志并检查是否设置了标志 - 使用作为位掩码的常量。

为什么不完整 | CURRENT 与 INCOMPLETE ^ CURRENT?

相同

我正在努力从掩码中删除一点并返回它看起来的值。

您不能对不是 2 的幂的值使用这样的按位运算。

值 3 可以是以下任何值:

  • CURRENT
  • COMPLETE | INCOMPLETE
  • CURRENT | COMPLETE
  • CURRENT | INCOMPLETE
  • CURRENT | COMPLETE | INCOMPLETE

无法判断是哪种组合。

将值更改为

  • 完成 = 1
  • 完成 = 2
  • 当前 = 4
  • NOT_APPLICABLE = 8

并且用 2 的幂进行按位运算非常容易。