简要说明
- 柯里化(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]优先级
toString()返回字符串(偏向字符串运算)valueOf()返回原始值(偏向数值运算)[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