2022-09-18笔试题00
请注意,本文编写于 581 天前,最后修改于 581 天前,其中某些信息可能已经过时。

面试高频手撕代码题

实现一个 add 函数 满足 add(1,2,3)与 add(1)(2)(3)结果相同

这是函数柯里化的一种基本表现形式

function add() {
  let args = [...arguments];
  let fn = function () {
    args.push(...arguments);
    return fn;
  };
  fn.toString = function () {
    // toString
    return args.reduce((t, v) => t + v);
  };
  return fn;
}

alert(add(1, 2, 3));
alert(add(1)(2)(3));

函数柯里化

参考链接

函数的柯里化:curry(又叫部分求值)

把接受多个参数的函数变成接受一个参数的函数,并返回一个新的函数;

实现方法:用一个闭包,返回一个函数,这个函数每次执行都会改写储存参数的数组,当函数的参数够了之后,便会执行

ES5 实现

function curry(fn, args = []) {
  // 获取函数需要的参数长度
  var length = fn.length;
  return function () {
    // 拼接得到现有的所有参数
    for (let i = 0; i < arguments.length; i++) {
      args.push(arguments[i]);
    }
    // 判断参数的长度是否已经满足函数所需参数的长度
    if (args.length >= length) {
      // 如果满足,执行函数
      return fn.apply(this, args);
    } else {
      // 如果不满足,递归返回科里化的函数,等待参数的传入
      return curry.call(this, fn, args);
    }
  };
}

// test
let add = curry((a, b, c) => a + b + c);
// 一个一个测试
console.log(add(1)(2)(3));
console.log(add(1, 2)(3));
console.log(add(1)(2, 3));

ES6 实现

function curry(fn, ...args) {
  return fn.length <= args.length ? fn(...args) : curry.bind(null, fn, ...args);
}

// test
let add = curry((a, b, c) => a + b + c);
console.log(add(1)(2)(3));
console.log(add(1, 2)(3));
console.log(add(1)(2, 3));

本文作者:前端小毛

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!