前端需要知道的三个不常用的函数式编程范式

news/2024/7/5 3:34:15

1、柯里化函数

  • 柯里化函数(Currying)定义:是把接受多个参数的函数变换成接受一个单一参数的函数**(最初函数的第一个参数)的函数,能夠返回接受余下的参数而且返回结果的新函数**的技术

  • 作用:减少代码冗余,增加可读性

    函数的柯里化,是 Javascript 中函数式编程的一个重要概念。它返回的,是一个函数的函数。

    其实现方式,需要依赖参数以及递归,通过拆分参数的方式,来调用一个多参数的函数方法,以达到减少代码冗余,增加可读性的目的

  • 实现

        // 写一个 sum 方法,当使用下面的语法调用时,能正常工作
        // console.log(sum(2, 3)); // Outputs 5
        // console.log(sum(2)(3)); // Outputs 5  
    
        // 下面是接收多个参数的函数
        function sum(a, b, c) {
          console.log(a + b + c);
        }
    
        // 柯里化 函数
        //  函数
        //  传入最后一个参数,本例代表c
        function curry(fn, lastValue) {
          return function (...args) {
            // args : 获取调用的函数的参数列表
            if (lastValue) {
              // 判断最后参数是否有赋值
              args = args.concat(lastValue)
            }
    
            // 判断参数的大小来决定传回一个函数还是直接调用函数
            if (args.length < fn.length) {
              // 回调函数
              return curry(fn, args)
            } else {
              // 直接调用
              return fn.apply(null, args)
            }
          }
        }
    
        // 柯里化后
        sum = curry(sum, [1]);
        sum(2, 3)
        sum(2)(3)
        sum(2, 2, 3)
    
        // sum(1, 2, 3); // 6
        // sum(1, 2)(3); // 6
        // sum(1)(2, 3); // 6
        // sum(1)(2)(3); // 6
    

2、函数组合

  • 函数组合(Function Composition)定义:函数组合是将多个函数合并为一个新函数的过程

  • 作用:可以将多个要依次调用的函数合并为一个函数,从而避免了函数的嵌套调用

  • 实现

        let fn1 = x => (x + 10)
        let fn2 = x => (x * 10)
        let fn3 = x => (x / 10)
        // 函数嵌套调用,导致代码可读性极差,且难以维护
        console.log(fn3(fn1(fn2(fn1(5)))));   // log:16
    	// ======================================================
    	function compose(...args) {
          // 1 获取长度
          let len = args.length
          // 2 参数非函数跳出
          let arr = []
          args.forEach(fn => {
            if (typeof fn === 'function') {
              arr.push(fn)
            }
          })
          // 3 返回出执行函数
          return (x) => {
            if (len === 0) {
              return arr[0](x)
            }
            else if (len === 1) {
              return x
            }
            else if (len) {
              return arr.reduce((reg, fn2) => {
                // 第一次为函数,后面为参数
                return typeof reg === 'function' ? fn2(reg(x)) : fn2(reg)
              })
            }
          }
        }
        console.log(compose()(5));
        console.log(compose(fn1)(5));
        console.log(compose(fn1, fn2)(5));
        console.log(compose(fn1, fn2, fn3)(5));
        console.log(compose(fn1, fn2, fn3, fn1)(5));
    

3、函数链式调用

  • 函数链式调用(Method Chaining)定义:在一个对象上连续调用多个方法,并且每个方法都返回该对象本身

  • 作用:可以将多个函数调用连接在一起,从而减少嵌套层级

  • 实现

    const calculator = {
      value: 0,
    
      add(num) {
        this.value += num;
        return this;
      },
    
      subtract(num) {
        this.value -= num;
        return this;
      },
    
      multiply(num) {
        this.value *= num;
        return this;
      },
    
      divide(num) {
        this.value /= num;
        return this;
      },
    
      getResult() {
        return this.value;
      }
    };
    
    const result = calculator.add(5)
                          .multiply(3)
                          .subtract(2)
                          .divide(4)
                          .getResult();
    
    console.log(result); // 输出: 2.5
    

关注公众号:前端兔 查看更多前端知识分享~~


http://lihuaxi.xjx100.cn/news/1356283.html

相关文章

【问题总结】Docker环境下备份和恢复postgresql数据库

目录 文章目录 以从备份恢复forest_resources库为例一、备份数据库二、需要还原的数据库准备1 删除掉远程的库。2 重新创建一个空的库。可以使用sql3 找到数据库存放的路径&#xff0c;并将备份文件上传到对应的路径下 三、 进入docker容器内部&#xff0c;执行数据库恢复附录…

Jenkins (一)

Jenkins (一) Docker Jenkins 部署 一. 安装 jenkins $ mkdir -p /home/tester/data/docker/jenkins $ vim jenkins:lts-jdk11.sh./jenkins:lts-jdk11.sh 内容 #! /bin/bash mkdir -p /home/tester/data/docker/jenkins/jenkins_homesudo chown -R 1000:1000 /home/tester/da…

注解和反射:(一)注解

P1 什么是注解 注解 Annotation 作用 不是程序本身&#xff0c;但可以对程序作出解释。&#xff08;这点和**注释Comment没区别&#xff09;可以被其他程序&#xff08;如&#xff1a;编译器&#xff09;读取 格式 // 注释名 Override// 还可以添加一些参数值 SuppressWar…

Docker 仓库与注册表: 构建可靠的容器镜像生态系统

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

韧性数据安全体系组成:运行保障与底线防御安全 |CEO专栏

「构建适应性进化的韧性数据安全体系」专栏&#xff0c;为你解读美创科技在数据安全的最新探索实践。 上期内容&#xff08;点击此处跳转&#xff09;&#xff0c;专栏重点分享了韧性数据安全体系的重要组成——资产和资产安全。数据资产是网络中最为确定性的存在&#xff0c;以…

快速排序递归实现和非递归实现(详解)

内容&#xff1a;快速排序的递归/非递归实现代码及注解&#xff0c;思路详解&#xff0c;以及快速排序的优化 目录 快速排序的递归实现&#xff1a; 基本思想&#xff1a; 步骤&#xff1a; 让基准值排序到最终位置&#xff0c;使得左右区间自然分割开的方法有如下三种&am…

本来想写一点map有关的题可是没有看到

题目简述 有 &#xfffd;N 个站点按顺序排在一条直线上&#xff0c;第 &#xfffd;(1≤&#xfffd;≤&#xfffd;)i(1≤i≤N) 个站点是 &#xfffd;&#xfffd;Si​。 有一辆火车会在其中的 &#xfffd;(&#xfffd;≤&#xfffd;)M(M≤N) 个站点停下,第 &#xfff…

国产单端口1000M以太网收发(PHY)芯片介绍

2023年将是国产以太网&#xff08;Ethernet&#xff09;传输芯片公司崛起之年&#xff0c;将涌现了一大批性能稳定&#xff0c;质量可靠的产品&#xff0c;国产网络传输芯片涵盖Ethernet PHY、Switch等中高端市场,如单&#xff08;或多&#xff09;端口千兆以太网PHY品牌&#…