关于js柯里化做笔试题时遇到一个问题

请实现test2函数满足以下四个条件使其通过测试,以最简洁的方式完成,并保证代码质量
module.exports.test2 = (input) => {
}

(1)test2() === 0
(2)test2(1)() === 1
(3)test2(1)(2)(3)(4)() === 10
(4)const t2 = test2(1)(2); t2(3)() === 6; t2(4)() === 7
我写了一个函数,但是只能满足前三个条件,求大神赐教,怎么同时满足这四个条件,不知道咋写。

阅读 3.2k
4 个回答

题目已经给出了函数的签名,那么答案是不应该擅自改动的。

module.exports.test2 = (input) => {
  const fn = a => b => b == null ? a : fn(a + b)
  return input == null ? 0 : fn(input)
}
function test2 (...args) {
  if (args.length === 0) {
    return 0
  }
  return function (num) {
    if (typeof num === 'number') {
      return test2(...args, num)
    } else {
      return args.reduce((sum, current) => sum + current)
    }
  }
}

难点如何存储之前的参数,可以使用包裹一层函数的方式来存储,代码如下:

const test2 = (function create (...args) {
    return function compute (v) {
        if (v === undefined) {
            return args.reduce((r, v) => r += v, 0)
        }
        return create(...args, v)
    }
})()

演示地址:https://codesandbox.io/s/74z9...

var add = function() {
    var _this = this,
    _args = arguments
    return function() {
        if (!arguments.length) {
            var sum = 0;
            for (var i = 0,c; c = _args[i++];) sum += c
            return sum
        } else {
            Array.prototype.push.apply(_args, arguments) 
            return arguments.callee
        }
    }
}
推荐问题
宣传栏