Lodash 源码阅读-baseGetAllKeys
概述
baseGetAllKeys
是 Lodash 中一个内部工具函数,用于获取对象的所有可枚举属性名(包括普通属性和 Symbol 属性)。它是 _.keys
、_.keysIn
等函数的基础实现。
前置学习
依赖函数
isArray
:判断值是否为数组arrayPush
:将数组元素添加到目标数组中keysFunc
:获取对象可枚举属性名的函数(如Object.keys
)symbolsFunc
:获取对象 Symbol 属性名的函数(如Object.getOwnPropertySymbols
)
技术知识
- JavaScript 对象属性类型(普通属性、Symbol 属性)
- 可枚举性(enumerable)概念
- 数组操作
- 对象属性遍历方法
源码实现
javascript
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
var result = keysFunc(object);
return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
}
实现思路
baseGetAllKeys
函数的实现思路是:
- 首先获取对象的所有可枚举属性名
- 然后根据对象类型决定是否添加 Symbol 属性名
- 如果是数组,直接返回属性名数组
- 如果不是数组,将 Symbol 属性名添加到结果数组中
源码解析
参数说明
javascript
function baseGetAllKeys(object, keysFunc, symbolsFunc)
object
:要获取属性名的对象keysFunc
:获取普通属性名的函数(如Object.keys
)symbolsFunc
:获取 Symbol 属性名的函数(如Object.getOwnPropertySymbols
)
获取普通属性名
javascript
var result = keysFunc(object);
- 调用传入的
keysFunc
获取对象的所有可枚举属性名 - 结果存储在
result
数组中
条件判断和 Symbol 属性处理
javascript
return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
- 使用三元运算符判断对象是否为数组
- 如果是数组,直接返回
result
- 如果不是数组,使用
arrayPush
将 Symbol 属性名添加到result
中
总结
实现特点
- 灵活性:通过参数传入不同的属性获取函数,支持不同的属性获取策略
- 类型区分:对数组和普通对象采用不同的处理方式
- 完整性:同时获取普通属性和 Symbol 属性
- 性能优化:避免对数组进行不必要的 Symbol 属性处理
设计原则
- 单一职责原则:专注于获取对象的所有属性名
- 开闭原则:通过参数传入不同的函数,支持扩展不同的属性获取方式
- 代码复用:作为基础函数被多个上层函数使用