第一章 函数式JavaScript
3种常见编程范式 + 1
- 命令式 (C语言) 由一条条的命令组成
- 面向对象(JAVA) 对象与对象之间通过消息传递信息
- 函数式 (Clojure) 更像是套用数学公式 扩展
- 逻辑式 (SQL的query语句) 通过提问找到答案的编程方式
一等公民 : 函数和值有相同的地位,所有值在的地方都可以被函数替代。
JavaScript 的函数式支持
- 函数作为参数,典型的是 ES6的Array.Map(()=>{})
- 函数作为返回值,典制:柯里化(将多个参数的函数变为一次只能接受一个参数的函数)、thunk (?)
- 越来越函数式的ES6
- ES6的箭头函数
- Destructure 解构
- 尾递归优化 ?
JavaScript 与函数式编程的距离
- Javascript中除了6种原始类型(Boolean,Undefined,Null,Number,String,Symbol)之外的第7种Object类型数据结构是可变的
- 缺少惰性求值,比如数组中有1000个元素,但是只需要操作前10个元素
- 缺少对函数组合的支持
- 缺少尾递归优化
Clojure :运行在JVM上的Lisp方言
ClojureScript: 能够编译成javascript的Clojure
第二章、集合
集合是 函数式编程中 最常用到的数据结构
向量:带有索引的一组数据,向量拥有俩个特性:
- 不可变性(immutable): 一旦被创建,就不可改变
- 持久性(persistent):“改变“数据结构的另一种方式,返回一个建立在旧数据上的新数据结构。