腾讯面试题:手写Compose函数

140 阅读3分钟

引言

在JavaScript编程中,函数式编程范式提供了强大的工具来处理数据和行为,其中一个重要概念是组合函数(compose)。组合函数允许我们将多个函数组合成一个新的函数,从而以一种灵活且可读的方式处理数据流。这也是腾讯等大厂常考面试题,那么下文就通过问答的形式来进行讲解。祝各位大佬春招拿下心仪的大厂offer,年薪30W+,一年赚够彩礼钱。

问答

面试官:用js实现字符串转大写,字符串拼接从而实现打招呼(“HELLO” + x(转为大写的字符串) )功能。 面试者:好的

// 转大写
var toUpperCase = function(x) {
    return x.toUpperCase();
  }
  // 拼接
  var hello = function(x) {
    return 'HELLO, ' + x;
  }
  // 打招呼
  var greet = function(x){
return hello(toUpperCase(x));
console(greet("kevin"));
}

面试官:很好,那还能优化吗?如果我不是要转大写,我要转小写呢?你怎么实现。

面试者:心想:"要我优化,总不能写一下转小写函数照着再写一个greet函数吧?有了,用组合抽象函数 C = A(B(x)) 这样我就可以任意组合两个函数了,代码复用性提高”。

 // 小写
  var toLowerCase = function(x) {
    return x.toLowerCase();
  }

 //   手写compose 组合函数 
  var compose = function(f, g) {
    // 闭包
    return function(x) {
      return f(g(x));
    }
  }
  
  var greet = compose(hello, toLowerCase);
  console.log(greet('KEVIN'));

注意:组合函数是从右向左执行的,所以使用时要注意顺序,如上面var greet = compose(hello,toLowerCase); 先转大写,再拼接,所以toLowerCase在右边,hello在左。

面试官:说说你对高阶函数的理解

面试者:

高阶函数是指那些以函数为参数或返回值为函数的函数。在函数式编程中,高阶函数非常常见,它们提供了强大的抽象能力,允许我们创建和操作函数。

组合函数(compose)本身就是一个高阶函数,因为它接受一个或多个函数作为参数,并返回一个新的函数。这个新函数会将传入的参数依次通过所有提供的函数进行处理,并返回最终结果。这种能力使得组合函数成为函数式编程中一个非常有用的工具,因为它允许我们将小的、可复用的函数组合成更大的、更复杂的函数,而无需改变这些小函数的内部实现。

面试官:那么好,还能优化吗?如果我要传入的是函数个数是使用时确定的呢?你怎么搞。

面试者:心想:我天,怎么还不够吗?有了

var compose = function() {
    // 获取所有传入的函数参数
    var args = arguments;
    // 获取最后一个函数的索引
    var start = args.length - 1;
    // 返回一个新的函数
    return function(x) {
        // 从最后一个函数开始执行
        var i = start;
        // 执行最后一个函数并传入初始值 x
        var result = args[start].call(this, x);
        // 从倒数第二个函数开始,依次执行每个函数
        while (i--) {
            // 将上一个函数的结果作为参数传入当前函数
            result = args[i].call(this, result);
        }
        // 返回最终结果
        return result;
    }
}

// 使用 compose 组合 hello 和 toUpperCase 函数
var greet = compose(hello, toUpperCase);
// 调用组合后的函数并传入参数 'kevin'
console.log(greet('kevin'));

arguments 是一个在所有非箭头函数内部都可用的局部变量。它是一个类似数组的对象,包含了传递给函数的参数值。 当你使用compose函数时你传入几个参数,arguments能够将其捕获,这个例子当中 arguments 被用在 compose 函数里,用于捕获所有传递给 compose 函数的参数hello,toUpperCase

面试官:可以,那我们继续......