如何使函数 add 在 javascript 中工作 - console.log(add(2)(3)(4)) //9 不使用 valueof 或 toString

abc*_*xyz 2 javascript recursion currying

javascript问题添加无限数字,末尾没有空括号

我试过这个:

const Sum = function (a) {
        function innerFunc (b) {
            console.log("B", b)
            return b ? Sum(a + b) : a;
        }
    }
  console.log(Sum(2)(3)(4))
Run Code Online (Sandbox Code Playgroud)

但它适用于 console.log(Sum(2)(3)(4)()) 即最后一个空括号,有没有办法通过更改函数来做到这一点,以便没有空括号的控制台日志给出正确的结果结果,目前它抛出一个错误,指出 Sum 不是函数

Nin*_*olz 5

toString您可以在需要字符串的函数中实现和使用它。

function add(...args) {
    let total = 0;
    
    function sum (...args) {
        total += args.reduce((a, b) => a + b, 0);
        return sum;
    }

    sum.toString = function () {
        return total;
    }

    return sum(...args);
}

console.log(add(1, 2, 3));                //  6
console.log(add(1)(2)(3));                //  6
console.log(add(1, 2)(2)(3));             //  8
console.log(add(1, 6)(2, 2)(3));          // 14
console.log(add(1, 6)(2, 2)(3, 4, 5, 7)); // 30
Run Code Online (Sandbox Code Playgroud)

更高级的版本可以使用该函数进行计算以及Symbol.toPrimitive

function add(...args) {
    let total = 0;
    
    function sum (...args) {
        total += args.reduce((a, b) => a + b, 0);
        return sum;
    }

    sum[Symbol.toPrimitive] = function (hint) {
        return (['string', 'default'].includes(hint))
            ? total
            : sum;
    };

    return sum(...args);
}

console.log(add(1, 2, 3));                //  6
console.log(add(1)(2)(3));                //  6
console.log(add(1, 2)(2)(3));             //  8
console.log(add(1, 6)(2, 2)(3));          // 14
console.log(add(1, 6)(2, 2)(3, 4, 5, 7)); // 30
console.log(add(1, 2)(3, 4) + 32);        // 42
Run Code Online (Sandbox Code Playgroud)