mirror of
https://github.com/KazooTTT/kazoottt-blog-v2.git
synced 2025-06-25 03:31:29 +08:00
2.2 KiB
2.2 KiB
title, date, author, tags, toAstro, slug, description, noteId_x, create_time, update_time, publish_time, link, notionID, date_created, date_modified
title | date | author | tags | toAstro | slug | description | noteId_x | create_time | update_time | publish_time | link | notionID | date_created | date_modified | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
lodash中的位运算 | 2023-10-20T00:00:00.000Z | KazooTTT |
|
true | lodash-bit-cal | 在lodash的深拷贝源码中,使用了位运算来控制拷贝行为。通过设置不同的标志位,如CLONE_DEEP_FLAG和CLONE_SYMBOLS_FLAG,分别控制深拷贝和是否克隆symbol属性。这些标志位通过按位或(|)运算组合成一个变量,然后通过按位与(&)运算在baseClone函数中解构,以确定具体的拷贝行为。这种设计使得代码更加高效且灵活,能够根据不同的标志位组合实现不同的拷贝需求。 | 6 | 2023/10/20 09:56:48 | 2023/10/20 10:28:41 | 2023/10/20 10:28:22 | https://kazoottt.notion.site/lodash-43f6444559334df780b685ca74591cec | 43f64445-5933-4df7-80b6-85ca74591cec | 2025-01-04T03:34:08.000Z | 2025-01-22T05:39:22.000Z |
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),其他同理
也就是说可以通过或的操作把变量组合为一个变量
然后再用与操作,把变量解构成不同的变量