接下来我要对Lodash的源码进行剖析学习
每天几个小方法,跟着我一起来学lodash吧
1、_.max(array)
毫无疑问,该方法就是取出数组array中的最大值
看一下官方的例子,也没什么好说的:
下面直接看源码:
function max(array) {
//如果array为空则输出undefined,反之进入baseExtremum进行处理
return (array && array.length)
? baseExtremum(array, identity, baseGt)
: undefined;
}
module.exports = max;
其中有三个依赖函数,我依次列出
(1)identity
该函数没有什么特别的地方,就是输入value输出value
function identity(value) {
return value;
}
module.exports = identity;
(2)baseGt
该函数输入的两个数,输出布尔值,如果value大于other则输出true,反之输出false
function baseGt(value, other) {
return value > other;
}
module.exports = baseGt;
(3)baseExtremum
这个函数就是最重要的了,基本上所有的处理都在该函数里面
//在我们最开始的函数中得到,在baseExtremum中iteratee就是我们的函数identity,而comparator是我们的函数baseGt
function baseExtremum(array, iteratee, comparator) {
var index = -1,
length = array.length;
while (++index < length) {
var value = array[index],
//将数组内的数依照while循环依次赋值给current
current = iteratee(value);
//如果current的值定义了,那么进入comparator函数,也就是baseGt函数
//如果current的值大于computde,则输出true
if (current != null && (computed === undefined
? (current === current && !isSymbol(current))
: comparator(current, computed)
)) {
//在循环中,current的值与value的值是相同的,所以结果等于value
var computed = current,
result = value;
}
}
return result;
}
module.exports = baseExtremum;
2、_.min(array)
介绍完最大值,当然得有最小值了,如果 array 是 空的或者假值将会返回 undefined。
下面我们看官方例子:
这就也没什么好说的啦,直接看源码:
function min(array) {
return (array && array.length)
? baseExtremum(array, identity, baseLt)
: undefined;
}
module.exports = min;
果然和max方法是一样的,只不过有个不同的函数baseLt,那么猜想它是与baseGt功能相反的
(1)baseLt
function baseLt(value, other) {
return value < other;
}
module.exports = baseLt;
这就没有错了,baseGt中是value > other,那么具体过程这里也就不多说了,因为实在是和max一模一样
3、_.mean(array)
前面讲了取最大值最小值,那么该方法就是取数组内的平均数了
例子不多说啦,直接看源码:
function mean(array) {
return baseMean(array, identity);
}
module.exports = mean;
到这里看到源码也不能判断它的实现过程,因为主要是使用了依赖的函数baseMean
其中identity函数我也不多说了,前面几个方法有提及过
(1)baseMean
function baseMean(array, iteratee) {
//获取到元素的个数
var length = array == null ? 0 : array.length;
//只要数组不为0,则输出baseSum(array, iteratee) / length
return length ? (baseSum(array, iteratee) / length) : NAN;
}
module.exports = baseMean;
到了这里我们可以看到输出的就是baseSum(array, iteratee) / length
既然length是元素的个数,那么baseSum函数的功能就一定是求和,接下来我们研究一下baseSum函数
(2)baseSum
function baseSum(array, iteratee) {
var result,
index = -1,
length = array.length;
while (++index < length) {
//iteratee在该方法里面就是identity,即在循环内依次赋值数组元素给current
var current = iteratee(array[index]);
//经过判断后对元素进行累加
if (current !== undefined) {
result = result === undefined ? current : (result + current);
}
}
//输出累加结果
return result;
}
module.exports = baseSum;
最后该方法就是实现了累加的作用
所以理清关系还是挺容易理解的
今天就到这里了