位运算状态机用单个整数的二进制位表示多个布尔状态,支持高效读写清查操作,内存占用小、执行快,适用于异步与并发场景,但受限于32位整数且需注意可读性与输入校验。

位运算特别适合状态机这类需要频繁切换、判断和组合多个布尔状态的场景。它把多个状态压缩进一个整数,用单次操作完成读、写、清、查,避免对象属性访问和数组遍历开销。
用单个整数承载全部状态
每个状态对应一个独立的二进制位,例如:
-
LOADING →
1 << 0(即 1) -
ERROR →
1 << 1(即 2) -
SUCCESS →
1 << 2(即 4) -
PENDING →
1 << 3(即 8)
这样,state = LOADING | SUCCESS 就是 5(二进制 0101),表示两个状态同时激活。内存只占 4 字节,远低于用对象或 Set 存储。
高效状态操作无需分支
所有常见操作都是一条位运算表达式:
立即学习“Java免费学习笔记(深入)”;
- 检查是否处于某状态:
state & ERROR(非零即真) - 进入新状态:
state |= PENDING - 退出某状态:
state &= ~ERROR - 切换状态(有则关、无则开):
state ^= LOADING - 清除所有状态:
state = 0
这些全是 CPU 单指令级操作,不触发属性查找、不新建对象、不调用方法,执行路径稳定且极快。
适配异步流程与并发控制
在请求状态机、表单提交机或动画状态同步中,常需原子性更新多个相关状态。比如“正在提交且禁用按钮且显示加载图标”,可统一用一个整数管理:
- 定义:
const SUBMITTING = 1 << 0, DISABLED = 1 << 1, SHOW_LOADER = 1 << 2 - 批量启用:
state |= SUBMITTING | DISABLED | SHOW_LOADER - 成功后批量清理:
state &= ~(SUBMITTING | DISABLED),再单独保留SHOW_LOADER或清空
相比分别赋值三个布尔字段,这种方式天然具备“全有或全无”的语义一致性,也更易做响应式依赖追踪(如 Vue 的 userState 响应式变量只需监听一个 number)。
注意事项与边界处理
位运算状态机不是万能的,需注意三点:
- JavaScript 位运算按 32 位有符号整数处理,有效状态位最多 31 个(符号位不可用),超出需拆分或换方案
- 负数参与运算会转为补码,建议只用非负整数初始化状态,并避免直接传入未校验的用户输入
- 可读性略低,务必配合常量命名和注释,例如:
// state: bit0=loading, bit1=error, bit2=success


















