Lodash源码阅读-values

120 阅读3分钟

Lodash 源码阅读-values

概述

values 函数用于获取对象自身可枚举属性的所有值并将其作为数组返回。该函数能够处理各种类型的对象,包括普通对象、数组、类数组等,返回一个由对象属性值组成的数组。当传入 nullundefined 时,函数会返回空数组。

前置学习

依赖函数

  • baseValues:内部工具函数,接收一个对象和一个属性名数组,将对象中对应属性的值提取为一个数组返回。
  • keys:获取对象自身可枚举属性的键名数组,不包括继承属性。
  • arrayMap:遍历数组并对每个元素应用迭代函数,返回映射后的新数组。
  • isArrayLike:检查值是否为类数组对象,判断依据是值不为空且具有有效的 length 属性且不是函数。

技术知识

  • JavaScript 对象属性遍历
  • 空值(null/undefined)处理
  • 数组映射转换
  • 类数组对象概念

源码实现

function values(object) {
  return object == null ? [] : baseValues(object, keys(object));
}

实现思路

  • 首先检查输入对象是否为 nullundefined,如果是则直接返回空数组
  • 如果对象有效,通过 keys(object) 获取对象自身可枚举属性的键名数组
  • 然后调用 baseValues 函数,根据对象和键名数组,提取出对应的属性值数组并返回
  • 整体实现简洁,通过组合现有的工具函数实现了功能复用

源码解析

1. 函数定义与参数处理

function values(object) {
  return object == null ? [] : baseValues(object, keys(object));
}

这是一个非常简洁的函数,只接收一个 object 参数。首先使用 object == null 检查参数是否为 nullundefined,这是一种常见的简写方式,因为在 JavaScript 中,null == undefinedtrue

如果 objectnullundefined,函数直接返回空数组 [],确保调用安全性并避免在后续处理中出现错误。

2. 获取对象的键名

如果对象有效,函数会调用 keys(object) 获取对象自身的可枚举属性键名数组。keys 函数具体实现为:

function keys(object) {
  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
}

这里会根据对象是否为类数组决定调用 arrayLikeKeysbaseKeys 函数。对于数组和类数组对象,使用的是 arrayLikeKeys;对于普通对象,使用 baseKeys

3. 提取属性值

获取到键名数组后,通过 baseValues 函数将键名映射为对应的属性值:

baseValues 函数内部使用 arrayMap 遍历键名数组,对每个键名 key 提取 object[key] 值,最终返回一个由属性值组成的新数组。

4. 使用示例

// 对普通对象使用
values({ a: 1, b: 2, c: 3 }); // => [1, 2, 3]

// 对数组使用
values(["a", "b", "c"]); // => ['a', 'b', 'c']

// 对 null 使用
values(null); // => []

// 对字符串使用
values("abc"); // => ['a', 'b', 'c']

总结

  • 使用 == 代替 === 进行空值检查可以同时处理 nullundefined,减少代码量
  • 三元运算符在简单条件判断时可以有效提高代码的简洁性和可读性
  • 通过组合基础函数来实现更复杂的功能,体现了良好的代码复用性
  • 在处理对象属性值时,利用键名数组作为中间结果可以分离关注点,提高代码清晰度