以下为ChatGPT自动生成的解答,正确与否请自行判断。

BFE.devAI解答 - JavaScript 代码题
23. 实现一个sum()方法

实现如下:

function sum(num) {
  let result = num; // 初始值为第一次调用传入的参数
  const fn = function(num2) {
    result += num2; // 将每次调用的参数加到result中
    return fn;
  }
  fn.valueOf = function() { // 重写valueOf方法,返回sum的结果
    return result;
  };
  return fn;
}

以上实现中,使用了函数柯里化的思想,每次调用返回一个新的函数,将结果累加到闭包变量result中,并重写valueOf方法,最后返回这个新函数。当我们对这个函数进行计算或打印时,会自动调用重写的valueOf方法,返回累加的结果。

其他的一些解答思路:

使用闭包:

function sum(a) {
  function inner(b) {
    return sum(a + b);
  }
  inner.valueOf = inner.toString = () => a;
  return inner;
}

使用 ES6 箭头函数:

const sum = a => {
  const _sum = b => sum(a + b);
  _sum.valueOf = () => a;
  return _sum;
};

使用代理对象:

function Builder(fn, args) {
  const self = this;
  this.fn = fn;
  this.args = args || [];
  return new Proxy(fn, {
    get(target, name) {
      if (name !== "valueOf") {
        return self;
      }
      return () => self.args.reduce((a, b) => a + b, 0);
    },
    apply(target, thisArg, args) {
      return new Builder(target, self.args.concat(args));
    }
  });
}
const sum = num => new Builder(null, [num]);