React中的位运算解析

155 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

为什么要用位运算

看过源码的小伙伴,都应该知道在React中使用了位运算,来判定那个值是对的,文件位置:packages->shared->ReactSideEffectTags.js,但是它也有一些副作用,比如说对一个Dom删除、更新、添加、修改等,这些副作用都用二进制的数字来进行表示

export const NoEffect = 0b000000000000;
export const PerformedWork = 0b000000000001;

export const Placement = 0b000000000010
export const Update =  0b000000000100
export const PlacementAndUpdate = 0b000000000110

注意~ Placement表示的一个test实例,Update表示的是它和Placement合并的实例所以是100,PlacementAndUpdate表示的是它和UpdatePlacement三个合并之后的实例,所以是110

解析

新增

如果要新增一个Placement,必定要在NoEffect的基础上新增,所以通过按位或的方式保留它两个中的一个,通过这种方式可以避免重复添加!

Update = NoEffect | Placement

增加多个以上

如果要新增一个Update,则需要跟Placement进行按位或比较,比较累加后就有了PlacementAndUpdate

PlacementAndUpdate = Placement | Update

任何操作,累加起来就可以得到新的值

删除

如果要删除一个,则需要反过来进行按位或比对,合并后的值按位或合并前的值,这样大大的增加性能。按位或 |:对比两个二进制值的bit,如果结果为1,那结果为1,如果不是结果为0

Placement = Placement | NoEffect

删除多个以上

删除多个,则需要指定删除的元素和指定删除元素的上一个元素,通过|方式进行删除,这就是多个操作的组合得到的结果

Placement = Update | Placement 
Placement = 0b000000000100 |  0b000000000010

最后

react中有很多个表示上下文的函数,在运算时需要经常判断,在那个上下文中,这就有了位运算,虽然项目中位运算用到的比较少,但如果项目有增删改查和切片和各种操作混合,可以用二进制方式来实现