持续创作,加速成长!这是我参与「掘金日新计划 · 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表示的是它和Update和Placement三个合并之后的实例,所以是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中有很多个表示上下文的函数,在运算时需要经常判断,在那个上下文中,这就有了位运算,虽然项目中位运算用到的比较少,但如果项目有增删改查和切片和各种操作混合,可以用二进制方式来实现