函数柯里化,curry(),add()方法,toString(),valueOf(),Symbol.toPrimitive优先级

172 阅读1分钟

简要说明

  • 柯里化(currying):指的是将一个多参数的函数拆分成一系列函数,每个拆分后的函数都只接受一个参数(unary)。
function add(a){
    return function(b){
        return a + b
    }
}
add(1)(2)//output:3

curry()

  • curry的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数
function curry(fn){
    const len = fn.length//记录函数形参数量
    return function(...args){
        if(len === args.length){//实参等于形参,结束函数
            return fn(...args)
        }
        return curry(fn.bind(null,...args))//不等于,继续调用
    }
}

function sum(a, b, c, d) {
   return a + b + c + d
}

curry(sum)(1)()(2)(3, 4) //output:10

  • 简化
const curry = fn => (...args) === args.length >= fn.length ? fn(...args) : curry(fn.bind(null, ...args))

add()

  • 实现柯里化(toString,valueOf,Symbol.toPrimitive)(参数不确定)
function add() {
      const args = [...arguments]

      function _add() {
        args.push(...arguments)
        return _add
      }
      const type = ['toString', 'valueOf', Symbol.toPrimitive]
      type.forEach(val => {
        return _add[val] = () => args.reduce((per, cur) => per + cur)
      })
      return _add
    }
    add(1)(2)(3).toString()//output:6
    add(1)(2)(3, 4).valueOf()///output:10
    add(1)(2)(3, 4)(5)[Symbol.toPrimitive]()//output:15

toString(),valueOf(),[Symbol.toPrimitive]优先级

  1. toString()返回字符串(偏向字符串运算)
  2. valueOf() 返回原始值(偏向数值运算)
  3. [Symbol.toPrimitive] 在返回原始值前调用

优先级: 3 > 2 > 1

    var obj = {
      toString() {
        console.log('toString')
        return 1
      },
      valueOf() {
        console.log('valueOf')
        return 2
      },
      [Symbol.toPrimitive]() {
        console.log('toPrimitive')//output:"toPrimitive"
        return 3
      }
    }
    obj + 1 //output:4