本書主要介紹了函數(shù)式編程的基礎(chǔ)理論、核心技術(shù)、典型特征和應用領(lǐng)域,以及它與面向?qū)ο缶幊痰谋容^。本書既廣泛介紹函數(shù)式編程的思想,也結(jié)合JavaScript的特點分析其應用和局限,注重從本質(zhì)和內(nèi)在邏輯的角度解釋各個主題,并輔以相關(guān)的代碼演示。對于函數(shù)式編程涉及的JavaScript語言本身的特性,以及與面向?qū)ο缶幊痰谋容^,在書中也給予了重點討論。
(1)本書涵蓋函數(shù)式編程的理論基礎(chǔ)、核心技術(shù)、典型特征。
(2)本書介紹了函數(shù)式編程中的遞歸模式和列表處理。
(3)本書系統(tǒng)地比較了面向?qū)ο缶幊膛c函數(shù)式編程。
潘俊,從事軟件開發(fā)工作15年,CSDN博客專家。曾在IBM developerWorks上發(fā)表過兩篇論文:《在 LotusScript 中為自定義對象模擬事件》和《JavaScript 的新領(lǐng)域——動態(tài)圖片處理(SVG)》;在百度閱讀上發(fā)表了兩本電子書:《IT原來如此——寫給文科生的IT書》和《羅輯思維不邏輯》;《Live軟件開發(fā)面面談》已由清華大學出版社出版。
第 1章 名稱 1
1.1 名稱綁定 1
1.2 作用域 3
1.2.1 包塊作用域與就近聲明 5
1.2.2 靜態(tài)作用域和動態(tài)作用域 7
1.2.3 前向引用和提升 9
1.3 閉包 10
1.4 小結(jié) 14
第 2章 類型系統(tǒng) 15
2.1 類型是什么 15
2.2 常用的數(shù)據(jù)類型 16
2.2.1 整數(shù) 16
2.2.2 浮點數(shù) 16
2.2.3 布爾值 17
2.2.4 字符 17
2.2.5 元組、結(jié)構(gòu)體、類 17
2.2.6 函數(shù) 19
2.2.7 數(shù)組、字符串、隊列、堆棧、
列表 20
2.2.8 結(jié)構(gòu)體、映射 22
2.2.9 深入復合類型 23
2.3 強類型與弱類型 24
2.4 名義類型與結(jié)構(gòu)類型 26
2.5 靜態(tài)類型與動態(tài)類型 27
2.5.1 靜態(tài)類型 27
2.5.2 動態(tài)類型 30
2.6 多態(tài)性 32
2.6.1 子類型多態(tài)性 33
2.6.2 參數(shù)多態(tài)性 35
2.7 JavaScript的類型系統(tǒng) 38
2.7.1 undefined和null 39
2.7.2 弱類型 43
2.7.3 變成強類型 47
2.8 鴨子類型與多態(tài)性 52
2.9 小結(jié) 53
第3章 lambda演算和函數(shù) 54
3.1 命令式編程中函數(shù)的作用 54
3.2 lambda演算 57
3.2.1 定義 57
3.2.2 記法 58
3.2.3 化約 58
3.2.4 算數(shù) 59
3.2.5 邏輯運算 61
3.2.6 函數(shù)式編程的特點 61
3.3 JavaScript中的函數(shù) 62
3.3.1 定義函數(shù) 63
3.3.2 調(diào)用函數(shù) 71
3.3.3 傳遞參數(shù) 71
3.3.4 模塊 74
3.4 小結(jié) 75
第4章 函數(shù)是一等值 76
4.1 函數(shù)參數(shù) 76
4.1.1 數(shù)組的迭代方法 77
4.1.2 設(shè)計函數(shù)參數(shù) 78
4.2 函數(shù)返回值 81
4.2.1 判斷數(shù)據(jù)類型 82
4.2.2 日志 83
4.2.3 讀取對象屬性 85
4.3 高階函數(shù) 86
4.3.1 組合謂詞函數(shù) 87
4.3.2 改變函數(shù)參數(shù)數(shù)目 89
4.3.3 檢查參數(shù)類型 91
4.3.4 記憶化 94
4.4 小結(jié) 98
第5章 部分應用和復合 100
5.1 部分應用 100
5.2 柯里化 103
5.2.1 增強的柯里化 106
5.2.2 從右向左柯里化 108
5.2.3 進一步增強的柯里化 109
5.2.4 柯里化的性能成本 111
5.2.5 應用柯里化的方式 113
5.2.6 參數(shù)的順序 115
5.2.7 柯里化與高階函數(shù) 115
5.3 復合 118
5.3.1 管道與數(shù)據(jù)流 122
5.3.2 函數(shù)類型與柯里化 124
5.4 一切都是函數(shù) 126
5.4.1 操作符的函數(shù)化 127
5.4.2 方法的函數(shù)化 132
5.4.3 控制流語句的函數(shù)化 138
5.5 性能與可讀性 141
5.6 小結(jié) 142
第6章 副作用和不變性 144
6.1 副作用 144
6.2 純函數(shù) 145
6.2.1 外部變量 147
6.2.2 實現(xiàn) 148
6.2.3 函數(shù)內(nèi)部的副作用 148
6.2.4 閉包 151
6.3 不變性 152
6.3.1 哲學上的不變性與身份 152
6.3.2 簡單類型與復合類型 153
6.3.3 值類型與引用類型 154
6.3.4 可變類型與不可變類型 155
6.3.5 可變數(shù)據(jù)類型的不足之處 156
6.3.6 克隆與凍結(jié) 158
6.3.7 不可變的數(shù)據(jù)結(jié)構(gòu) 163
6.3.8 不可變的映射與數(shù)組 167
6.3.9 不可變類型的其他好處 170
6.4 小結(jié) 171
第7章 遞歸 172
7.1 調(diào)用自身 173
7.1.1 遞歸的思路 176
7.1.2 帶累積參數(shù)的遞歸函數(shù) 177
7.2 遞歸的數(shù)據(jù)結(jié)構(gòu) 180
7.2.1 構(gòu)建列表 180
7.2.2 樹 184
7.3 遞歸與迭代 186
7.3.1 名稱 186
7.3.2 理念與對比 186
7.3.3 迭代協(xié)議 189
7.3.4 遞歸協(xié)議 192
7.3.5 搜索樹 195
7.4 尾部遞歸 198
7.4.1 調(diào)用堆棧 198
7.4.2 尾部調(diào)用優(yōu)化 200
7.4.3 怎樣算是尾部調(diào)用 201
7.4.4 尾部遞歸 204
7.5 遞歸的效率 205
7.6 小結(jié) 209
第8章 列表 211
8.1 處理列表 211
8.1.1 函數(shù)的三種寫法 211
8.1.2 處理列表的高階函數(shù) 213
8.2 函數(shù)式編程的列表接口 218
8.2.1 沒有副作用的方法 219
8.2.2 有副作用的方法 220
8.2.3 列表接口中的其他函數(shù) 222
8.3 小結(jié) 225
第9章 從面向?qū)ο蟮胶瘮?shù)式編程 226
9.1 面向?qū)ο缶幊痰奶攸c 226
9.1.1 封裝性 227
9.1.2 繼承性 227
9.1.3 多態(tài)性 228
9.2 JavaScript面向?qū)ο缶幊?232
9.2.1 創(chuàng)建和修改單個對象 233
9.2.2 克隆和復制屬性 234
9.2.3 原型 234
9.2.4 建構(gòu)函數(shù) 235
9.2.5 建構(gòu)函數(shù)與類型繼承 237
9.2.6 原型與類型繼承 242
9.2.7 Proxy與對象繼承 245
9.2.8 Mixin 248
9.2.9 工廠函數(shù) 251
9.3 函數(shù)式編程的視角 255
9.3.1 不可變的對象 256
9.3.2 評判面向?qū)ο缶幊?257
9.4 方法鏈與復合函數(shù) 260
9.4.1 方法鏈 260
9.4.2 延遲的方法鏈 264
9.4.3 復合函數(shù) 265
9.4.4 函數(shù)式的SQL 266
9.5 小結(jié) 271