內容簡介
本書主要介紹了函式式編程的基礎理論、核心技術、典型特徵和套用領域,以及它與面向對象編程的比較。本書既廣泛介紹函式式編程的思想,也結合JavaScript的特點分析其套用和局限,注重從本質和內在邏輯的角度解釋各個主題,並輔以相關的代碼演示。對於函式式編程涉及的JavaScript語言本身的特性,以及與面向對象編程的比較,在書中也給予了重點討論。
本書適合希望學習函式式編程的JavaScript程式設計師閱讀,對一般的函式式編程理念感興趣的讀者也可以將本書作為參考 。
目錄
內容提要 5
前言 5
第1章 名稱 6
1.1 名稱綁定 6
1.1.1 常量和變數 7
1.2 作用域 8
1.2.1 包塊作用域與就近聲明 9
1.2.2 靜態作用域和動態作用域 11
1.2.3 前向引用和提升 13
1.3 閉包 14
1.3.1 包塊作用域與閉包 16
1.4 小結 17
第2章 類型系統 17
2.1 類型是什麼 17
2.2 常用的數據類型 18
2.2.1 整數 19
2.2.2 浮點數 19
2.2.3 布爾值 19
2.2.4 字元 19
2.2.5 元組、結構體、類 19
2.2.6 函式 20
2.2.7 數組、字元串、佇列、堆疊、列表 21
2.2.8 結構體、映射 23
2.2.9 深入複合類型 24
2.3 強類型與弱類型 25
2.4 名義類型和結構類型 26
2.5 靜態類型與動態類型 27
2.5.1 靜態類型 27
2.5.2 動態類型 29
2.6 多態性 31
2.6.1 子類型多態性 32
2.6.2 參數多態性 34
2.7 JavaScript的類型系統 36
2.7.1 undefined和null 37
2.7.2 弱類型 40
2.7.3 變成強類型 43
2.8 鴨子類型和多態性 46
2.9 小結 47
第3章 Lambda演算和函式 48
3.1 命令式編程中函式的作用 48
3.1.1 抽象級別 49
3.2 Lambda演算 50
3.2.1 定義 51
3.2.2 記法 51
3.2.3 化約 51
3.2.4 算數 52
3.2.5 邏輯運算 53
3.2.6 函式式編程的特點 54
3.3 JavaScript中的函式 55
3.3.1 定義函式 56
3.3.2 調用函式 61
3.3.3 傳遞參數 61
3.3.4 模組 63
3.5 小結 64
第4章 函式是一等值 64
4.1 函式參數 65
4.1.1 數組的疊代方法 65
4.1.2 設計函式參數 66
4.2 函式返回值 69
4.2.1 判斷數據類型 69
4.2.2 日誌 70
4.2.3 讀取對象屬性 71
4.3 高階函式 72
4.3.1 組合謂詞函式 73
4.3.2 改變函式參數數目 74
4.3.3 檢查參數類型 76
4.3.4 記憶化 78
4.4 小結 81
第5章 部分套用和複合 81
5.1 部分套用 81
5.2 柯里化 83
5.2.1 增強的柯里化 86
5.2.2 從右向左柯里化 87
5.2.3 進一步增強的柯里化 88
5.2.4 柯里化的性能成本 90
5.2.5 套用柯里化的方式 91
5.2.6 參數的順序 92
5.2.7 柯里化與高階函式 93
5.3 複合 95
5.3.1 管道和數據流 97
5.3.2 函式類型與柯里化 99
5.4 一切都是函式 101
5.4.1 操作符的函式化 101
5.4.2 方法的函式化 105
5.4.3 控制流語句的函式化 109
5.5 性能和可讀性 112
5.6 小結 113
第6章 副作用和不變性 113
6.1 副作用 113
6.2 純函式 114
6.2.1 外部變數 115
6.2.2 實現 117
6.2.3 函式內部的副作用 117
6.2.4 閉包 119
6.3 不變性 120
6.3.1 哲學上的不變性與身份 120
6.3.2 簡單類型和複合類型 121
6.3.3 值類型和引用類型 122
6.3.4 可變類型和不可變類型 123
6.3.5 可變數據類型的壞處 123
6.3.6 克隆和凍結 125
6.3.7 不可變的數據結構 128
6.3.8 不可變的映射和數組 131
6.3.9 不可變類型的其他好處 134
6.4 小結 135
第7章 遞歸 136
7.1 調用自身 136
7.1.1 遞歸的思路 138
7.1.2 帶累積參數的遞歸函式 139
7.2 遞歸的數據結構 142
7.2.1 構建列表 142
7.2.2 樹 145
7.3 遞歸與疊代 146
7.3.1 名稱 146
7.3.2 理念和對比 146
7.3.3 疊代協定 148
7.3.4 遞歸協定 150
7.3.5 搜尋樹 152
7.4 尾部遞歸 154
7.4.1 調用堆疊 154
7.4.2 尾部調用最佳化 156
7.4.3 怎樣算是尾部調用 157
7.4.4 尾部遞歸 159
7.5 遞歸的效率 160
7.6 小結 163
第8章 列表 164
8.1 處理列表 164
8.1.1 函式的三種寫法 165
8.1.2 處理列表的高階函式 166
8.2 函式式編程的列表接口 169
8.2.1 沒有副作用的方法 170
8.2.2 有副作用的方法 171
8.2.3 列表接口中的其他函式 173
8.3 小結 175
第9章 從面向對象到函式式編程 175
9.1 面向對象編程的特點 175
9.1.1 封裝性 176
9.1.2 繼承性 176
9.1.3 多態性 177
9.2 JavaScript面向對象編程 180
9.2.1 創建和修改單個對象 180
9.2.2 克隆和複製屬性 181
9.2.3 原型 182
9.2.4 建構函式 182
9.2.5 建構函式和類型繼承 184
9.2.6 原型和類型繼承 186
9.2.7 Proxy和對象繼承 189
9.2.8 Mixin 191
9.2.9 工廠函式 193
9.3 函式式編程的視角 196
9.3.1 不可變的對象 196
9.3.2 評判面向對象編程 197
9.4 方法鏈和複合函式 199
9.4.1 方法鏈 199
9.4.2 延遲的方法鏈 202
9.4.3 複合函式 203
9.4.3 函式式的SQL 203
9.5 小結 207