JavaScript 中的按位运算符作为状态标志
Bitwise operators in JavaScript as flags on a state
我正在尝试将一些逻辑安装到我正在处理的一段 JS 中,它将根据某些条件简单地 add/remove 标记。
主要分为两步
- 根据一些有状态数据构建对象
- 交给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 的幂进行按位运算非常容易。
我正在尝试将一些逻辑安装到我正在处理的一段 JS 中,它将根据某些条件简单地 add/remove 标记。
主要分为两步
- 根据一些有状态数据构建对象
- 交给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 的幂进行按位运算非常容易。