休息了一段时间,又要开始重整旗鼓继续学习了
接下来我要对Lodash的源码进行剖析学习
每天几个小方法,跟着我一起来学lodash吧
1、_.add(augend, addend)
该方法的功能是将两个数相加,看清楚只有两个数相加,并不能两个以上的数相加
我们来看官方的例子:
只有一个例子,输出结果就是两个数之和
接下来我们看该方法的源码:
var add = createMathOperation(function(augend, addend) {
return augend + addend;
}, 0);
module.exports = add;
这里其实没什么好难的,但是如果用书面的语言来解释这个函数的功能还是有点吃力的,在数组方法的源码的解释过程我就发现了这个问题,但是我还是努力将这些方法解释清楚吧
该方法只要依靠createMathOperation函数进行的,所以为了了解add函数的实现过程不可避免的要去了解它的依赖函数
2、createMathOperation
这些依赖函数大多都是没有文档的解释的,我们接着上面的add函数来说,下面直接上createMathOperation的源码:
/*第一个参数就是我们add函数里的function函数,第二个参数是add函数里的第二参数0 */
function createMathOperation(operator, defaultValue) {
/*value和other分别是两个数*/
return function(value, other) {
/*定义一个结果变量*/
var result;
/*对两个传入的值进行判断处理,如果两个值都为未定义,则输出我们的defaultValue,也就是0*/
if (value === undefined && other === undefined) {
return defaultValue;
}
/*通过第一轮判断后还有情况就是只有其中一个值是未定义,那么接下来的判断都是针对这种情况,如果第一个值不是未定义,则结果等于第一个值,下面一个判断也是一样*/
if (value !== undefined) {
result = value;
}
if (other !== undefined) {
if (result === undefined) {
return other;
}
/*如果数据类型是字符串类型,则对数据进行转换成整数*/
if (typeof value == 'string' || typeof other == 'string') {
value = baseToString(value);
other = baseToString(other);
} else {
value = baseToNumber(value);
other = baseToNumber(other);
}
//如果两个值都不是未定义,则可以进行第一个参数函数的输出结果value + other
result = operator(value, other);
}
/*最后输出结果*/
return result;
};
}
module.exports = createMathOperation;
看过这个依赖函数你就会发现,这就是对数据的一个判断处理的过程,因为你也不知道用户会输出什么,所以需要很多步的判断处理的过程。
3、_.divide(dividend, divisor)
该方法就是两数相除,我觉得该方法会使用到我们第一个函数的依赖函数
我们来看例子:
可以看到,结果就是 6 / 4 = 1.5
我们接下来看源码:
var divide = createMathOperation(function(dividend, divisor) {
return dividend / divisor;
}, 1);
module.exports = divide;
果然没错,也用到了createMathOperation这个函数,具体过程去看第二项createMathOperation函数的讲解
4、_.multiply(multiplier, multiplicand)
这个方法也和上面的方法一样,只不过它是两数相乘
我们来看例子和源码:
var multiply = createMathOperation(function(multiplier, multiplicand) {
return multiplier * multiplicand;
}, 1);
module.exports = multiply;
和上面几种方法也是大同小异了
5、_.subtract(minuend, subtrahend)
最后就是我们两数相减了
不多说直接看例子和源码:
var subtract = createMathOperation(function(minuend, subtrahend) {
return minuend - subtrahend;
}, 0);
module.exports = subtract;
过程都差不多,也就不过多解释了