上一阵子一直在忙着对前端界做出一点微小的贡献,再过两个多月就能揭晓。现在打算开一个天坑,把 lodash 的源码挨个解析一遍,学习下 npm 下载量最大、依赖最多的库的源码逻辑。
解析的代码为 2020 年 7 月 18 日的lodash 源码,版本是4.17.15,fork 到了自己的仓库中,顺序按照官网文档的顺序,在解析时会将该方法依赖的子方法也会全部分析下。有很多自己难理解或理解错的地方,抛砖引玉。
chunk
文档地址:https://lodash.com/docs/4.17.15#chunk
import slice from './slice.js';
import toInteger from './toInteger.js';
/**
* 将数组(array)拆分成多个 size 长度的区块,并将这些区块组成一个新数组。
* 如果array 无法被分割成全部等长的区块,那么最后剩余的元素将组成一个区块。
*
* @since 3.0.0
* @category Array
* @param {Array} array 需要处理的数组
* @param {number} [size=1] 每个数组区块的长度
* @returns {Array} 返回一个包含拆分区块的新数组(注:相当于一个二维数组)。
* @example
*
* chunk(['a', 'b', 'c', 'd'], 2)
* // => [['a', 'b'], ['c', 'd']]
*
* chunk(['a', 'b', 'c', 'd'], 3)
* // => [['a', 'b', 'c'], ['d']]
*/
function chunk(array, size = 1) {
// size必须大于等于0
size = Math.max(toInteger(size), 0);
// array为假时,length设为0;为真时设为数组长度
const length = array == null ? 0 : array.length;
// length为假或size为0时,返回空数组
if (!length || size < 1) {
return [];
}
// 初始化一个长度为(length / size并向上取整)的数组
let index = 0;
let resIndex = 0;
const result = new Array(Math.ceil(length / size));
// 循环取区块并赋值给result数组的对应位置
while (index < length) {
result[resIndex++] = slice(array, index, (index += size));
}
// 返回result
return result;
}
export default chunk;
slice
文档地址:https://lodash.com/docs/4.17.15#slice
/**
* 创建一个数组,来源是裁剪数组array,从 start 位置开始到 end 位置结束,但不包括 end 本身的位置。
*
* **注意:** 这个方法被用来代替
* [`Array#slice`](https://mdn.io/Array/slice)确保返回的是个稠密数组。
*
* @since 3.0.0
* @category Array
* @param {Array} array 要裁剪的数组
* @param {number} [start=0] 开始位置。负数索引将会被看作从数组结束位置的向前偏移。
* @param {number} [end=array.length] 结束位置。负数索引将会被看作从数组结束位置的向前偏移。
* @r