1.compose函数和洋葱模型(柯里化函数)
题目要求:f(g(h(x))) => compose(f,g,h)(x)
const add1 = x => x + 1
const div2 = x => x / 2
const mul3 = x => x * 3
const compose = (...args) => {
let len = args.length
if (len === 0) return x => x
if (len === 1) return args[0]
return function (x) {
return args.reduceRight((pre, cur) => {
return cur(pre)
}, x)
}
}
redux中的解决方案
const compose = (...funcs) => {
let len = funcs.length
if (len === 0) return x => x
if (len === 1) return funcs[0]
return funcs.reduce((pre,cur)=>{
return (...args)=>{
return pre(cur(...args))
}
}
)
}
2.实现sum(1)(2)(3,4)(5)可以无限累加的函数
const currying = () => {
let params = []
const add = (...args) => {
params = params.concat(args)
return add
}
add[Symbol.toPrimitive] = () =>
params.reduce((pre, cur) => pre + cur)
return add
}
const sum = currying()
const res = sum(1)(2)(3)(4, 5)
console.log(+res)
关于console.log(+res)输出结果的解释:
“+”可以将函数转为表达式执行,函数内部通过调用Symbol.toPrimitive,valueOf,toString(按照顺序匹配)实现,所以这里改写Symbol.toPrimitive方法