您的当前位置:首页lodash源码之add

lodash源码之add

2024-12-13 来源:哗拓教育

1、使用场景

add方法用于计算两个数的和

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

2、源码分析

add.js
import createMathOperation from './.internal/createMathOperation.js'

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

export default add

可以看到,add方法的源码很短。首先引入一个createMathOperation方法,执行该方法并赋值给add。
createMathOperation是一个高阶函数,高阶函数就是一个函数可以接收另一个函数作为参数,可以看到它接收了一个箭头函数作为参数。实际上add方法的核心内容就在createMathOperation这个方法里。

createMathOperation.js
import baseToNumber from './baseToNumber.js'
import baseToString from './baseToString.js'

function createMathOperation(operator, defaultValue) {
  return (value, other) => {
    // 如果执行add函数时不传参。add() => 0
    if (value === undefined && other === undefined) {
      return defaultValue
    }
    // 如果执行add函数时只传一个参数,返回该参数。add(1) => 1
    if (value !== undefined && other === undefined) {
      return value
    }
    if (other !== undefined && value === undefined) {
      return other
    }
    // 如果传入的参数含有字符串,就把两个参数都转换成string类型。add(1, '1') => '11'
    if (typeof value === 'string' || typeof other === 'string') {
      value = baseToString(value)
      other = baseToString(other)
    }
    else {  // 否则就转换成number类型
      value = baseToNumber(value)
      other = baseToNumber(other)
    }
    // 将转换好的参数传入调用createMathOperation函数时传入的operator函数
    return operator(value, other)
  }
}

export default createMathOperation

这个函数返回了一个箭头函数,因为前面add.js里面执行createMathOperation这个方法后赋值给add这个变量,所以这个箭头函数被赋值给了add这个变量,箭头函数里面的两个参数value和other便是add方法执行时传入的那两个参数。
继续往下看,这个箭头函数里面首先做了很多判断,对add()方法传入的不同参数类型做了一些处理:
1. 执行add函数的时候不传参,add() => 0

    if (value === undefined && other === undefined) {
      // defaultValue是add.js中createMathOperation方法的第二个参数,为0
      return defaultValue
    }

2. 执行add函数时只传一个参数,返回该参数

    if (value !== undefined && other === undefined) {
      return value
    }
    if (other !== undefined && value === undefined) {
      return other
    }

3. add方法传入的参数含有字符串,就把两个参数都转换成string类型

    if (typeof value === 'string' || typeof other === 'string') {
      value = baseToString(value)
      other = baseToString(other)
    }

4. 别的情况都转换成number类型

    else {
      value = baseToNumber(value)
      other = baseToNumber(other)
    }

最后把转换好的参数传入operator()这个函数里,该函数就是add.js里调用createMathOperation这个高阶函数传入的第一个参数:(augend, addend) => augend + addend

显示全文