Lodash 源码阅读-baseTimes
功能概述
baseTimes
是 Lodash 库中的一个内部工具函数,它是 _.times
方法的基础实现。这个函数的主要作用是执行一个迭代函数 n 次,并将每次执行的结果收集到一个数组中返回。与公开的 _.times
方法不同,baseTimes
不支持迭代器简写形式,也不进行最大数组长度检查,它是一个更加精简和专注的内部实现。
前置学习
依赖关系
baseTimes
是一个相对独立的函数,它不直接依赖其他 Lodash 函数。但要理解它在 Lodash 中的应用,建议了解以下相关函数:
- times :公开的 API,它使用
baseTimes
作为核心实现 - Array 构造函数:用于创建指定长度的数组
技术知识
- JavaScript 中的数组操作:创建、访问和修改数组
- 函数作为参数传递:理解高阶函数的概念
- 循环和迭代:使用 while 循环进行迭代操作
源码实现
javascript
/**
* The base implementation of `_.times` without support for iteratee shorthands
* or max array length checks.
*
* @private
* @param {number} n The number of times to invoke `iteratee`.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns the array of results.
*/
function baseTimes(n, iteratee) {
var index = -1,
result = Array(n);
while (++index < n) {
result[index] = iteratee(index);
}
return result;
}
实现思路
baseTimes
函数的实现思路非常直接明了,可以分为以下几个步骤:
- 初始化:创建一个索引变量和一个指定长度的结果数组
- 迭代执行:使用 while 循环,对每个索引执行迭代函数
- 收集结果:将每次执行的结果存储到结果数组中
- 返回结果:返回包含所有执行结果的数组
这种实现方式简洁高效,没有额外的检查和处理逻辑,专注于核心功能的实现。
源码解析
参数解析
javascript
function baseTimes(n, iteratee) {
函数接收两个参数:
n
:要执行迭代函数的次数,应该是一个非负整数iteratee
:每次迭代要执行的函数,它接收当前的索引作为参数
初始化变量
javascript
var index = -1,
result = Array(n);
这段代码初始化了两个变量:
index
:迭代索引,初始值为 -1,这样在第一次循环时++index
会使其变为 0result
:结果数组,使用Array(n)
创建一个长度为 n 的空数组
使用 Array(n)
而不是 []
然后 push 的好处是可以预先分配内存空间,提高性能,特别是当 n 较大时。
迭代执行
javascript
while (++index < n) {
result[index] = iteratee(index);
}
这段代码是函数的核心部分:
- 使用 while 循环,从 0 到 n-1 进行迭代
- 在每次迭代中,调用
iteratee(index)
函数,并将结果存储到result[index]
中 - 循环继续,直到
index
等于或超过n
这种实现方式确保了迭代函数被精确地执行 n 次,并且每次执行的结果都被正确地存储在结果数组中。
返回结果
javascript
return result;
最后,函数返回包含所有执行结果的数组。
总结
baseTimes
是 Lodash 中一个简单但强大的内部工具函数,它提供了一种高效的方式来执行迭代函数并收集结果。虽然它是一个内部函数,但通过 _.times
方法,它的功能被暴露给了库的使用者。
这个函数的主要特点包括:
- 简洁性:实现简单明了,只关注核心功能
- 高效性:通过预分配数组和简单循环优化性能
- 灵活性:可以与各种迭代函数结合使用,创建各种类型的数组
- 实用性:在创建特定长度的数组、生成测试数据、初始化数据结构等场景中非常有用
理解 baseTimes
的工作原理,有助于我们更好地使用 Lodash 的 _.times
方法,并在自己的代码中实现类似的功能。在需要重复执行某个操作并收集结果的场景中,这种模式非常有用,可以使代码更加简洁和可读。