Files
kazoottt-blog/src/content/post/lodash中的位运算.md
2025-01-22 05:06:47 +00:00

68 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: lodash中的位运算
date: 2023-10-20
author: KazooTTT
tags:
- lodash
- 源码学习
published: true
slug: lodash-bit-cal
description: >-
在lodash的深拷贝源码中使用了位运算来控制拷贝行为。通过设置不同的标志位如CLONE_DEEP_FLAG和CLONE_SYMBOLS_FLAG分别控制深拷贝和是否克隆symbol属性。这些标志位通过按位或|)运算组合成一个变量,然后通过按位与(&运算在baseClone函数中解构以确定具体的拷贝行为。这种设计使得代码更加高效且灵活能够根据不同的标志位组合实现不同的拷贝需求。
noteId_x: 6
create_time: '2023/10/20 09:56:48'
update_time: '2023/10/20 10:28:41'
publish_time: '2023/10/20 10:28:22'
link: 'https://kazoottt.notion.site/lodash-43f6444559334df780b685ca74591cec'
notionID: 43f64445-5933-4df7-80b6-85ca74591cec
---
# Lodash 中的位运算
在阅读 lodash 的深拷贝源码的时候,发现有 FLAG 这样的变量。
```ts
// 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 的时候,
```ts
// 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),其他同理
也就是说可以通过或的操作把变量组合为一个变量
然后再用与操作,把变量解构成不同的变量