SOURCE

// //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 命令行工具 X clear

                    
>
console