Reactソースの読み取り:複合タイプのデザイン


Reactのコード設計について
最近はReactのソースコードを見ていますが、いくつかの興味深い詳細に気づいています.
workInProgress.effectTag |= Ref
(workInProgress.effectTag & DidCapture) !== NoEffect
シフト演算は普段あまり使われていない私にとって最初に何を表しますか?なぜこのように設計しますか?
まず見てみます.このeffectTagには具体的にその値があります.
// Don't change these two values. They're used by React Dev Tools.
export const NoEffect = /*              */ 0b00000000000;
export const PerformedWork = /*         */ 0b00000000001;

// You can change the rest (and add more).
export const Placement = /*             */ 0b00000000010;
export const Update = /*                */ 0b00000000100;
export const PlacementAndUpdate = /*    */ 0b00000000110;
export const Deletion = /*              */ 0b00000001000;
export const ContentReset = /*          */ 0b00000010000;
export const Callback = /*              */ 0b00000100000;
export const DidCapture = /*            */ 0b00001000000;
export const Ref = /*                   */ 0b00010000000;
export const Snapshot = /*              */ 0b00100000000;

// Union of all host effects
export const HostEffectMask = /*        */ 0b00111111111;

export const Incomplete = /*            */ 0b01000000000;
export const ShouldCapture = /*         */ 0b10000000000;
このように見ると面白そうです.ほとんどの値は一人だけです.1、他の人は全部00bxxxです.
振り返ってみます.上の二つの表現を見ます.
workInProgress.effectTag |= Ref
//    
workInProgress.effectTag = workInProgress.effectTag | RefRef
私たちは適当に二つの値を挙げます.例えば、PlacementUpdate、つまり0b00000000010 | 0b00000000100のように得られた結果は何ですか?0b00000000110、つまりPlacementAndUpdateです.ですから、この時点では、なぜ大部分の値1が位置しているのかが分かります.各ビットの1は属性を表しています.彼らを結合すると、複数の属性があり、重複がないということです.
同様な第二の表現
(workInProgress.effectTag & DidCapture) !== NoEffect
UpdateDidCaptureを持って&を操作したら、結果は明らかになります.すべてのビットは0です.したがって、後期の&は、ある変数に属性が含まれているかどうかを判断するために動作します.例えば、workInProgress.effectTagDidCaptureという属性が含まれているかどうかを判断する.
このようなデザインはとても参考になります.似たような権限システムで使えます.多分今は多くの権限システムがこのようにしています.ただ私は分かりません..
Reactのソースコードは今読んでいます.一ヶ月か二ヶ月ですべての成果を出すことが期待されます.興味があるのは私に関心を持つことができます.