咱们先看下Lodash中文文档对add办法的解释:

_.add(augend, addend)
两个数相加。
参数
augend (number): 相加的第一个数。
addend (number): 相加的第二个数。
返回
(number): 返回总和。
例子

_.add(6, 4);// => 10

接下来 咱们通过源码档次来看看add办法的具体用法

const add = createMathOperation((augend, addend) => augend + addend, 0)export default add

从源码档次能够看出 add办法是createMathOperation办法返回的函数,createMathOperation办法传入两个参数:
第一个参数是一个一般的add逻辑办法
第二个参数是一个默认值0

function createMathOperation(operator, defaultValue) {  //返回一个函数 value,other是调用lodash办法(例如_add)传入的参数  return (value, other) => {    //如果第一个参数和第二个参数都没有定义 则返回默认值0    if (value === undefined && other === undefined) {      return defaultValue    }    //如果第一个参数有值 第二个参数没有值 则返回第一个参数    if (value !== undefined && other === undefined) {      return value    }    //如果第一个参数没有值 第二个参数有值 则返回第二个参数    if (other !== undefined && value === undefined) {      return other    }    //如果第一个参数或者第二个参数为字符串(至多其中一个为字符串) 则将参数通过baseToString办法都转换为字符串    if (typeof value === 'string' || typeof other === 'string') {      value = baseToString(value)      other = baseToString(other)    }    else {      //如果两个参数都不是字符串  则将参数通过baseToNumber办法都转换为数字      value = baseToNumber(value)      other = baseToNumber(other)    }    //这个时候将被转换的参数传入createMathOperation办法的第一个操作函数,并返回后果    return operator(value, other)  }}

代码里的baseToString办法

function baseToString(value) {  // 如果是字符串 间接返回  if (typeof value === 'string') {    return value  }  // 如果是数组 递归转换值(易受调用堆栈限度的影响)  if (Array.isArray(value)) {    return `${value.map(baseToString)}`  }  //如果是Symbol值  调用 Symbol.prototype.toString.call办法进行转换 例如:Symbol('a') 的转换后果为 'Symbol(a)'  if (isSymbol(value)) {    return symbolToString ? symbolToString.call(value) : ''  }  //对字符串0 返回0 或者'-0'的解决 这块我还没有想到什么利用场景 欢送补充  const result = `${value}`  return (result === '0' && (1 / value) === -INFINITY) ? '-0' : result}

代码里的baseToNumber办法

function baseToNumber(value) {  //如果是数字 间接返回  if (typeof value === 'number') {    return value  }  //如果是Symbol类型  返回NAN  if (isSymbol(value)) {    return NAN  }  //将字符串通过+转换为数字  return +value}

baseToString,baseToNumber办法中的isSymbol办法

function isSymbol(value) {  const type = typeof value  return type == 'symbol' || (type === 'object' && value != null && getTag(value) == '[object Symbol]')}

通过源码咱们发现

_add(true)  //返回 true_add(undefined,'5') // '5'_add('3',5)   // 返回  '35'_add('3',['5',4])  //返回  ‘35,4’_add('3',Symbol('a'))  //返回 '3Symbol(a)'

留神:Lodash中 divide办法(除法)、multiply办法(乘法)、subtract办法(减法)都是通过createMathOperation实现的