《JavaScript ES6函数式编程入门经典》精读笔记

写在前面

  • 书籍介绍:使用JavaScript ES6带你学习函数式编程。你将学习柯里化、偏函数、高阶函数以及Monad等概念。
  • 我的简评:作为前端,深入理解函数式编程的理念对以后的学习和工作大有裨益,这本书用ES6来解说函数式编程,值得一读。
  • !!福利:文末有pdf书籍、笔记思维导图、随书代码打包下载地址哦

第一章 函数式编程简介

1.1.什么是函数式编程?为何它重要

    1. 函数式编程技术主要基于数学函数和它的思想
    1. 数学函数定义的关键是函数逻辑不应依赖外部环境
    1. 函数式编程是一种范式,我们能够以此创建仅依赖输入就可以完成自身逻辑的函数
    1. 函数与JavaScript方法:1. 函数是一段可以通过其名称被调用的代码;.2. 方法是一段必须通过其名称及其关联对象的名称被调用的代码

1.2.引用透明性

    1. 所有的函数对于相同的输入都将返回相同的值
    1. 同步的问题在于线程不应该在并发运行的时候依赖全局数据

1.3.命令式、声明式与抽象

    1. 函数式编程主张声明式编程和编写抽象的代码

1.4.函数式编程的好处

1.5.纯函数

  • .1.纯函数产生可测试的代码:1. 不纯的函数具有副作用;2. 纯函数不应依赖任何外部变量,也不应改变任何外部变量
  • 2.合理的代码

1.6.并发代码

1.7.可缓存

1.8.管道与组合

    1. 纯函数应该被设计为只做一件事。只做一件事并把它做到完美是UNIX的哲学
    1. 组合不是UNIX/LINUX命令行独有的,但他们是函数式编程范式的核心

1.9.纯函数是数学函数

1.10.我们要构建什么

1.11.JavaScript是函数式编程语言吗

    1. JavaScript不是一种纯函数语言(比如Haskell),而更像是一种多范式语言
    1. JavaScript语言支持将函数作为参数,以及将函数传递给另一函数等特性–主要原因是JavaScript将函数视为一等公民

第二章 JavaScript函数基础

2.1.ECMAScript历史

2.2.创建并执行函数

    1. 严格模式在ES5中被引入JavaScript,严格模式是一种JavaScript的受限变体:1.第一个函数;2.严格模式;3.return 语句是可选的;4.多语句函数;5.函数参数;6.ES5函数在ES6中是有效的

2.3.设置项目

  • 1.初始设置
  • 2.用第一个函数式方法处理循环问题
  • 3.export要点
  • 4.import要点
  • 5.使用Babel-node运行代码
  • 6.在npm中创建脚本
  • 7.从git上运行源代码

2.4.小结

    1. 利用babel工具的优势在Node平台上无缝的运行ES6代码

第三章 高阶函数

  • 允许以函数代替数据传递是一个非常强大的概念
  • 接受另一个函数作为其参数的函数称为高阶函数

3.1.理解数据

  • 1.理解JavaScript数据类型:1. 由于函数是类似String的数据类型,因此我们能够传递它们,或把它们存入一个变量等
  • 2.存储函数
  • 3.传递函数
  • 4.返回函数

3.2.抽象和高阶函数

    1. 一般而言,高阶函数通常用于抽象通用的问题,换句话讲,高阶函数就是定义抽象:1.抽象的定义;2.通过高阶函数实现抽象

3.3.真实的高阶函数

  • 1.every函数
  • 2.some函数
  • 3.sort函数

3.4.小结

    1. 高阶函数的运行机制得益于JavaScript中另一个称为闭包的重要概念

第四章 闭包与高阶函数

4.1.理解闭包

  • 1.什么是闭包:1. 闭包如此强大的原因在于它对作用域链(或作用域层级)的访问;2. 从技术上讲,闭包有3个可访问的作用域(1.在它自身声明之内声明的变量;2.对全局变量的访问;3.对外部函数变量的访问);3. 闭包能够访问外部函数的变量。此处外部函数的含义是包裹闭包函数的函数(2.记住闭包生成的位置;3.回顾sortBy函数)

4.2.真实的高阶函数(续)

  • 1.tap函数
  • 2.unary函数
  • 3.once函数
  • 4.memoized函数

第五章 数组的函数式编程

  • 在JavaScript编程中,数组用于遍历。我们用数组来存储、操作和查找数据,以及转换(投影)数据格式
  • 把函数应用于一个值并创建一个新值的过程称为投影

5.1.数组的函数式方法

  • 1.map:1. 返回给定函数转换后的值
  • 2.filter:1. 把结果放入数组前检查一个条件

5.2.ConcatAll

  • 1.把所有嵌套数组连接到一个数组中

5.3.reduce函数

  • 1.设置累加器并遍历数组(记住累加器的上一个值)以生成一个单一元素

5.4.zip函数

  • 1.合并两个给定的数组

5.5.小结

  • 1.我们把这些函数称为投影函数,因为它们总是在应用转换操作(通过传入高阶函数)后返回数组

第六章 柯里化与偏应用

6.1.一些术语

  • 1.一元函数
  • 2.二元函数
  • 3.变参函数

6.2.柯里化

  • 柯里化是把一个多参数函数转换为一个嵌套的一元函数的过程
  • 1.柯里化用例
  • 2.日志函数-应用柯里化
  • 3.回顾curry
  • 4.回顾日志函数
  • 6.curry函数有助于移除很多函数调用中的样板代码

6.3.柯里化实战

  • 1.在数组内容中查找数字
  • 2.求数组的平方

6.4.数据流

  • 1.偏应用
  • 2.实现偏函数
  • 3.柯里化与偏应用:1. 这两种技术问题时什么时候该用哪一个?如果API是map、filter一样定义,我们就可以轻松地用curry函数解决问题。可能存在不是为curry函数设计的函数,比如例子中的setTimeout。在这种情况下,最适合的选择是使用偏函数;2. 使用curry或partial是为了让函数参数或函数设置变得更加简单和强大

6.5.小结

    1. 柯里化与偏应用一直是函数式编程的工具

第七章 组合与管道

  • 函数式组合在函数式编程中被称为组合

7.1.组合的概念

  • 1.Unix的理念:1. 每个程序只做好一件事情;2. 每个程序的输出应该是另一个尚未可知的程序的输入
  • 2.基础函数需要遵循如下规则:每一个基础函数都需要接受一个参数并返回数据
  • 3.我们将构建自己的compose函数,它将完成“|”在Unix/Linux中的工作

7.2.函数式组合

  • 1.回顾map与filter:1. 即创建一个函数,通过把一个函数的输出作为输入发送给另一个函数的方式把两个函数组合起来
  • 2.compose函数

7.3.应用compose函数

  • 1.引入curry与partial
  • 2.组合多个函数

7.4.管道/序列

  • 1.从左至右处理数据流的过程称为管道或序列
  • 2.重点是pipe和compose做相同的事情,只是数据流方向不同而已

7.5.组合的优势

  • 1.组合最重要的属性之一-组合满足结合律:1.组合满足结合率;2.使用tap函数调试

第八章 函子

  • 错误处理是一种常见的编程技术
  • 新概念,函子(Functor),它将用一种纯函数式的方式帮助我们处理错误

8.1.什么是函子

  • 1.函子是一个普通对象(在其他语言中,可能是一个类),它实现了map函数,在遍历每个对象值得时候生成一个新对象:1.函子是容器;2.函子实现了map方法

8.2.MayBe函子

  • 1.它使我们能够以更加函数式的方式处理代码中的错误:1.实现Maybe函子;2.简单用例;3.真实用例

8.3.Either函子

  • 1.实现Either函子
  • 2.reddit例子的Either版本
  • 3.如果有java背景,可能会觉得Either与Java8中的Optional很相似

8.4.Pointed函子

  • 1.Pointed函子是一个函子的子集,它具有实现了of契约的接口
  • 2.到目前为止我们设计的函子都可以称为Pointed函子

8.5.小结

  • 1.名为Maybe的函子,它能够帮助我们避免麻烦的null或undefined检查
  • 2.Either能够帮助我们在拓展分支时保存错误信息。它是Some和Nothing的超类型

第九章 深入理解Monad

9.1.根据搜索词条获取Reddit评论

9.2.问题描述

  • 1.实现第一步
  • 2.合并Reddit调用
  • 3.多个map的问题

9.3.通过join解决问题

  • 1.实现join
  • 2.实现chain

9.4. 什么是Monad?

  • 1.Monad就是一个含有chain方法的函子
  • 2.通过添加一个chain方法(当然也是join方法)扩展了Maybe函子,使其成为一个Monad
  • 3.Maybe是一个Monad还是一个函子。不要混淆:只有of和map的Maybe是一个函子,含有chain的函子是一个Monad

第十章 使用Generator

  • Generator不是一种函数式编程技术,但它是函数的一部分

10.1.异步代码及其问题

  • 1.同步的含义是函数在执行时会阻塞调用者,并在执行完毕后返回结果
  • 2.异步的含义是函数在执行时不会阻塞调用者,但是一旦执行完毕就会返回结果

10.2.Generator基础

  • 1.创建Generator
  • 2.Generator的注意事项
  • 3.yield关键字
  • 4.done属性
  • 5.向Generator传递数据

10.3.使用Generator处理异步调用

  • 1.一个简单的案例
  • 2.一个真实的案例

写在后面