// //func 1
// const curry = (fn, ...args) => {
// // 函数的参数个数可以直接通过函数数的.length属性来访问
// if(fn.length === args.length){
// // 传入的参数大于等于原始函数fn的参数个数,则直接执行该函数
// return fn.call(fn, ...args);
// }
// // 传入的参数小于原始函数fn的参数个数时
// // 则继续对当前函数进行柯里化,返回一个接受所有参数(当前参数和剩余参数) 的函数
// return (...rest) => curry(fn, ...args, ...rest);
// };
// const add = (x,y,z) => x + y +z;
// const curryAdd = curry(add);
// console.log(curryAdd(1,2,3))
// console.log(curryAdd(1,2)(3))
// console.log(curryAdd(1)(2,3))
// console.log(curryAdd(1)(2)(3))
// //fun2
// function curry(fn) {
// let judge = (...args) => {
// if (args.length == fn.length) return fn(...args)
// return (...arg) => judge(...args, ...arg)
// }
// return judge
// }
// function add(a, b, c) {
// return a + b + c
// }
// add(1, 2, 3)
// let addCurry = curry(add)
// addCurry(1)(2)(3)
//偏函数
// function partial(fn, ...args) {
// return (...arg) => {
// return fn(...args, ...arg)
// }
// }
// function add(a, b, c) {
// return a + b + c
// }
// let partialAdd = partial(add, 1)
// partialAdd(2, 3)
//函数在无参调用时 会默认执行toString | valueOf 来得到初始值
//此柯里化不用受参数个数限制
/**
* 知识点:对象(包括数组,对象,函数等)参与原始运算如算术或逻辑运算时,
* 会无参调用其 toString 或者 valueOf 方法得到一个原始值,
* 然后用这个原始值参与运算,这点上应该是借鉴自 Java,
* 但规则好像比 Java 要复杂,具体的我也没有太深究过,
* 毕竟 JavaScrip t里面我们很少利用这个特性(所以很多人其实不知道)。
* 能够持续调用,必然返回函数,能够当成数值,
* 那只能是因为它实现了 toString 或者 valueOf 方法。
*/
const curry = () => {
let result = [];
const add = (...args) => {
result = result.concat(args);
return add;
}
add.valueOf = add.toString = () => {
return result.reduce( (pre, cur) => pre + cur, 0);
}
return add;
}
const addCurry = curry();
console.log( +addCurry(1)(2)) //加号一定要有
console