当前位置: 首页 > news >正文

React19为什么一定要使用位运算?

一、位运算基础

1.1 二进制本质

JS 的 Number 在做位运算时:会转为 32 位有符号整数。

例如:

1 = 00000001
2 = 00000010
4 = 00000100
8 = 00001000

1.2 核心运算

(1)按位或 | —— 合并状态

1 | 2 = 3
0001
0010
----
0011

工程含义:合并多个状态

(2)按位与 & —— 判断包含

flags = 1 | 4 // 0101flags & 4 !== 0  // true

工程含义:判断某状态是否存在

(3)按位非 ~ —— 取反

~0001 = 1110

工程含义:用于“移除某状态”

(4)组合删除

flags = flags & ~Placement

工程含义:从集合中删除某个状态

1.3 为什么它像“集合”?

因为:每一位就是一个独立布尔位

它等价于:一个最多 31 个元素的集合

二、位运算在项目中的应用场景

2.1 权限系统

const READ  = 1 << 0
const WRITE = 1 << 1
const EXEC  = 1 << 2

组合:

const userPermission = READ | WRITE

判断:

if (userPermission & WRITE) {// 有写权限
}

优点:

  • 一个 number 存储所有权限
  • O(1) 判断,如果是数组或者对象什么的需要 O(n)
  • 内存占用极小

2.2 游戏引擎中的状态管理

例如角色状态:

受伤 | 无敌 | 中毒 | 隐身

这些都可以 bitmask 表示。

原因:

  • 高频判断
  • 状态组合多
  • 内存要求高

2.3 调度系统中的优先级集合

例如:

任务 A 优先级 1
任务 B 优先级 4
任务 C 优先级 8

合并:

pending = 1 | 4 | 8

选择最高优先级:

lowestBit = pending & -pending

这个技巧 React 里大量使用。

三、React19 中位运算的核心使用场景

3.1 ReactFiberFlags —— 副作用标记系统

源码位置:

packages/react-reconciler/src/ReactFiberFlags.js
export const Placement = 0b00000000000000010;
export const Update    = 0b00000000000000100;
export const Deletion  = 0b00000000000001000;
export const Passive   = 0b00000000001000000;

一个 Fiber 可能:

  • 既要插入 DOM
  • 又要更新属性
  • 还要执行 effect

所以:

fiber.flags = Placement | Update | Passive

判断:

if (fiber.flags & Placement)

这时候有同学就要问了~ 为什么不使用数组呢?假设使用数组:

fiber.flags = ['Placement', 'Update']

问题:

  • includes 是 O(n)
  • 每个 Fiber 都有数组
  • GC 压力大
  • commit 阶段是高频遍历

React commit 深度遍历整棵 Fiber 树,会产生很大的性能问题。

位运算是 CPU 指令级别。

3.2 subtreeFlags —— 子树聚合优化

React 19 里:

fiber.subtreeFlags

它表示:当前 Fiber 子树是否包含某些副作用

用途:

在 commit 阶段:

if ((fiber.subtreeFlags & PassiveMask) !== NoFlags)

可以一次判断整棵子树,而不必递归。

如果用数组,无法做到:O(1) 子树状态判断。

3.3 ReactFiberLane —— 并发优先级系统

这是位运算最核心的地方。

源码:

ReactFiberLane.js

例如:

export const SyncLane              = 0b0000000000000000001;
export const InputContinuousLane   = 0b0000000000000000010;
export const DefaultLane           = 0b0000000000000000100;

一个 root 可能同时有多个 pending 更新:

root.pendingLanes = laneA | laneB | laneC

选择最高优先级任务

function getHighestPriorityLane(lanes) {return lanes & -lanes;
}

这是经典位运算技巧:

x & -x = 最低位 1

作用:O(1) 选出最高优先级 lane

如果用数组:

  • 需要排序
  • 需要遍历
  • 需要比较
http://www.jsqmd.com/news/413357/

相关文章:

  • 基于Java springboot毕业生学历证明系统(源码+文档+运行视频+讲解视频)
  • vue+nodejs+ElementUi的电动车共享预约充电站管理系统 微信小程序的设计与实现
  • 2026年浆内/乳液/AKD/中性/表面/固体表面施胶剂供应商推荐:青州金昊新材料全系产品解析 - 品牌推荐官
  • 2026年测定仪源头厂家大比拼,这些品牌值得关注,测厚仪/热封仪/摩擦系数仪/试验机/测定仪,测定仪供应厂家口碑排行 - 品牌推荐师
  • springboot基于java网上订餐系统(源码+文档+运行视频+讲解视频)
  • [AI提效-54]-有哪些App的类型以及他们对应的系统架构
  • Java 条件语句 - if...else详解
  • 2026年知名的家车两用吸尘器/无线吸尘器厂家热销推荐 - 行业平台推荐
  • 2026年GEO系统贴牌源头厂家排行榜,这5家服务商入选国内TOP5口碑推荐 - 资讯焦点
  • AI写论文实用攻略!4款精选AI论文写作工具,提升论文质量有妙招!
  • springboot基于java农村土地管理系统流动人口(源码+文档+运行视频+讲解视频)
  • OA系统:企业信息化升级的得力助手
  • 2026年靠谱的云华教育航空留学/云华航空留学哪家质量好生产商实力参考 - 行业平台推荐
  • springboot基于Java外卖平台系统(源码+文档+运行视频+讲解视频)
  • 共话售后完善的GEO品牌公司,选哪家更放心 - 工业品牌热点
  • 2026年武汉专业木箱供应厂家综合评测与采购指南 - 2026年企业推荐榜
  • 2026年评价高的矿用本安型显示器/矿用显示器厂家推荐与采购指南 - 行业平台推荐
  • springboot基于Java旅游民宿信息管理系统旅游景点(源码+文档+运行视频+讲解视频)
  • 信任的基石:LV纪元如何通过开源与弃权重塑DeFi安全标准 - 资讯焦点
  • 效率直接起飞 10个AI论文软件测评:专科生毕业论文+科研写作必备工具推荐
  • Navicat Premium 17.1 中文绿色版安装教程
  • 2026年知名的微型划刀片/工业划刀片厂家选购完整指南 - 行业平台推荐
  • 2026年初杭州GEO推广公司实力盘点与选择指南 - 2026年企业推荐榜
  • ERROR: tablespace ... is not empty
  • 2026年质量好的包装机/超细粉脱气包装机品牌厂商推荐(更新) - 行业平台推荐
  • 2026年口碑好的跨境电商家用吸尘器/无线便携家用吸尘器用户好评厂家推荐 - 行业平台推荐
  • 2026年无锡民办高中推荐榜:新吴区私立与综合高中择校指南,解析优质教育服务与升学竞争力 - 品牌企业推荐师(官方)
  • 选网红登山火车定制厂商,全国范围内哪家的口碑比较靠谱? - mypinpai
  • ColumnList 组件编码
  • 2026年云南淘气堡设备工厂优选指南:效果图与实力并重 - 2026年企业推荐榜