JavaScript中pipe原理

代码示例

const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x);

原理

一行代码中信息量是非常丰富的,可以从以下几个方面来分析

(...fns)
  • ...是ES6标准中的数组扩展运算符

  • 扩展运算符可以展开数组:

    Math.max(...[1,2,3]) 等价于 Math.max(1,2,3)

  • 同时与解构赋值结合起来,用于生成数组,上述代码示例中就是使用该方法,具体例子:

    [...fns] = [1,2,3]fns=[1,2,3]

    • 解构赋值:ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构;示例:

      let [a,b,c] = [1,2,3]
=>
  • 这个就是箭头函数了,左边是函数参数,右边是函数体
  • 箭头函数有自己的特性,比如其中的this指向
    • this的指向的是定义时所在的对象,而不是使用时所在的对象
    • 不可以当做构造函数
    • 不可以使用arguments对象,可以用rest参数代替
      • rest参数是一种叫法,指的是(...variableName)这种写法的函数传参方式
    • 不可以使用yield命令
reduce
  • 该函数作用于数组对象
  • 接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值
  • 函数原型:Array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
    • 我们可以定义函数function(total, currentValue, currentIndex, arr),作为个性化的逻辑处理部分,并手动指定初始值initialValue
    • 初始值的作用在于首次执行自定义函数时,total参数的值为我们设置的初始值initialValue
    • currentValue为当前数组的值,也就是currentValue === arr[currentIndex]
函数科里化
  • 柯里化函数是一种由需要接受多个参数的函数转化为一次只接受一个参数的函数:如果一个函数需要3个参数,那柯里化后的函数会接受一个参数并返回一个函数来接受下一个函数,这个函数返回的函数去传入第三个参数,最后一个函数会应用了所有参数的函数结果。

  • 将上述代码示例转换一下形式:

    const pipe = function(x, ...fns) {
    fns.reduce((y, f) => f(y), x);
    }
进一步拆解
  • 为了看到pipe函数的实际作用,进一步将上述函数进行拆解,用最简单的语法表示,以更清楚窥探其内部原理

    	function pipe(x, ...fns){
    let total = x;
    for(let f in fns){
    total = f(total)
    }
    return total;
    }
示例
  • 当我们调用pipe(x, f1, f2)时,返回f2(f1(x))

  • 代码示例

    const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x);
    
    const f1 = x => {
    return x+1;
    } const f2 = x => {
    return 2 * x;
    } // (1+1)*2 = 4
    let result = pipe(f1, f2)(1);
    console.log(result);

JavaScript中pipe实战的更多相关文章

  1. JavaScript中的数据结构及实战系列

    本系列主要是讲解JavaScript中的数据结构及在实际项目中遇到的地方 JavaScript中的数据结构及实战系列(1):队列 JavaScript中的数据结构及实战系列(2):栈

  2. 让你分分钟学会Javascript中的闭包

    Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...

  3. Javascript中的闭包(转载)

    前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...

  4. JavaScript中的原型和原型链

    1.原型是什么?原型链是什么? 原型是一个prototype对象,用于表示类型之间的关系: 原型链指的是在JavaScript中对象之间的继承是通过prototype对象指向父类对象,直到指向Obje ...

  5. (译)JavaScript 中的正则表达式(RegEx)实操——快速掌握正则表达式,伴有随手可练的例子————(翻译未完待续)

    (原文:https://blog.bitsrc.io/a-beginners-guide-to-regular-expressions-regex-in-javascript-9c58feb27eb4 ...

  6. 狗日的Javascript中的闭包

    前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...

  7. 一篇文章把你带入到JavaScript中的闭包与高级函数

    在JavaScript中,函数是一等公民.JavaScript是一门面向对象的编程语言,但是同时也有很多函数式编程的特性,如Lambda表达式,闭包,高阶函数等,函数式编程时一种编程范式. funct ...

  8. JavaScript中的原型、原型链、原型模式

    今天,咱来聊聊JavaScript中的原型跟原型链 原型跟原型模式 这一块的知识,主要是设计模式方面的. 首先,我们知道JavaScript是面向对象的.既然是面向对象,那它自然也有相应的类跟对象等概 ...

  9. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

随机推荐

  1. PHP rmdir() 函数

    定义和用法 rmdir() 函数删除空的目录. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 rmdir(dir,context) 参数 描述 dir 必需.规定要删除的目录. ...

  2. PHP is_array() 函数

    is_array() 函数用于检测变量是否是一个数组.高佣联盟 www.cgewang.com PHP 版本要求:PHP 4, PHP 5, PHP 7 语法 bool is_array ( mixe ...

  3. luogu P3409 值日班长值周班长 exgcd

    LINK:值日班长值周班长 题目描述非常垃圾. 题意:一周5天 每周有一个值周班长 每天有一个值日班长 值日班长日换 值周班长周换. 共n个值日班长 m个值周班长 A是第p个值日班长 B是第q个值日班 ...

  4. CAS(乐观锁)以及ABA问题

    https://blog.csdn.net/wwd0501/article/details/88663621独占锁是一种悲观锁,synchronized就是一种独占锁:它假设最坏的情况,并且只有在确保 ...

  5. boost之signal的使用

    文章目录 简介 代码 模板实现: 测试代码 运行结果 简介 boost是C++的一个扩展库,被称为C++准标准库,里面的组件很丰富,并且引用方便,85%的组件只需要引用头文件即可使用. 并且在嵌入式系 ...

  6. 云服务器远程连接mysql数据库

    首先需要在云服务器上,下载安装好mysql与Navicat. mysql下载好以后,打开云端的开始,找到mysql的命令窗,进入输入自己的mysql密码,稍等片刻进入mysql数据库 进入之后输入下列 ...

  7. Python | 面试的常客,经典的生产消费者模式

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第23篇文章,我们来聊聊关于多线程的一个经典设计模式. 在之前的文章当中我们曾经说道,在多线程并发的场景当中,如果我 ...

  8. SonarQube 跳过指定检查

    SonarQube 跳过指定检查 如何让 SonarQube 忽略某些检查规则 环境 演示环境参考前边的文章 SonarQube 扫描 Java 代码 步骤 我们已经扫描一个 Java 项目 有 6 ...

  9. 菊长说丨一文读懂MySQL4种事务隔离级别

    经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢?今天我们就找菊长去,请他帮大家梳理一下这些各具特色的事务隔离级别,咱走着~~~ 点 ...

  10. java 泛型初理解

    泛型方法的定义: 方法1:其中<T extends Comparable<T>>  是用来修饰 List<T>中的T的,意味T必须继承Comparable接口 pu ...