Lodash 中的位运算

在阅读 lodash 的深拷贝源码的时候,发现有 FLAG 这样的变量。

// src/cloneDeep.ts
const CLONE_DEEP_FLAG = 1
const CLONE_SYMBOLS_FLAG = 4
 
function cloneDeep(value) {
  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG)
}
  • CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG 代表的是做位运行算,按位或操作
  • CLONE_DEEP_FLAG - 控制是否进行深拷贝
  • CLONE_SYMBOLS_FLAG - 控制是否克隆 symbol 属性
  • CLONE_DEEP_FLAG 的值是 1 二进制表示是 0001
    CLONE_SYMBOLS_FLAG 的值是 4,二进制表示是 0100

按位或计算如下:
0001
0100
0101
所以 1 | 4 二进制是 0101。结果是 5,

然后在传入 baseClone 的时候,

// src/.internal/baseClone.ts
function baseClone(value, bitmask, customizer, key, object, stack) {
  let result
  const isDeep = bitmask & CLONE_DEEP_FLAG
  const isFlat = bitmask & CLONE_FLAT_FLAG
  const isFull = bitmask & CLONE_SYMBOLS_FLAG
  ...
 
}

通过与运算来判断是否需要做某项操作。

之前我们传入的 bitmask 是 0101
然后 CLONE_DEEP_FLAG 是 0001
与运算得到的是 0001 (1),其他同理

也就是说可以通过或的操作把变量组合为一个变量
然后再用与操作,把变量解构成不同的变量