內容提要
ES6是ECMAScript標準十餘年來變動最大的一個版本,其中添加了許多新的語法特性,既有大家耳熟能詳的Promise,也有聞所未聞的Proxy代理和Reflection反射;既有可以通過轉譯器(Transpiler)等方式在舊版本瀏覽器中實現兼容的let、const、不定參數、展開運算符等功能,亦有無論如何都無法實現向前兼容的尾調用最佳化。深入理解ES6的特性對於所有JavaScript開發者而言至關重要,在可預見的未來,ES6中引入的語言特性會成為JavaScript應用程式的主流特性,這也是《深入理解ES6》的初衷。希望你通過閱讀《深入理解ES6》可以了解ES6的新特性,並在需要時能夠隨時使用。
目錄
第1章 塊級作用域綁定 1
var聲明及變數提升(Hoisting)機制 1
塊級聲明 3
-- let聲明 3
-- 禁止重聲明 4
-- const聲明 4
-- 臨時死區(Temporal Dead Zone) 6
循環中的塊作用域綁定 7
-- 循環中的函式 8
-- 循環中的let聲明 9
-- 循環中的const聲明 10
全局塊作用域綁定 12
塊級綁定最佳實踐的進化 13
小結 13
第2章 字元串和正則表達式 14
更好的Unicode支持 14
-- UTF-16碼位 15
-- codePointAt()方法 16
-- String.fromCodePoint()方法 17
-- normalize()方法 17
-- 正則表達式u修飾符 19
其他字元串變更 21
-- 字元串中的子串識別 21
-- repeat()方法 22
其他正則表達式語法變更 23
-- 正則表達式y修飾符 23
-- 正則表達式的複製 26
-- flags屬性 27
模板字面量 28
-- 基礎語法 28
-- 多行字元串 29
-- 字元串占位符 31
-- 標籤模板 32
小結 36
第3章 函式 37
函式形參的默認值 37
-- 在ECMAScript 5中模擬默認參數 38
-- ECMAScript 6中的默認參數值 38
-- 默認參數值對arguments對象的影響 40
-- 默認參數表達式 42
-- 默認參數的臨時死區 44
處理無命名參數 46
-- ECMAScript 5中的無命名參數 46
-- 不定參數 47
增強的Function構造函式 49
展開運算符 50
name屬性 52
-- 如何選擇合適的名稱 52
-- name屬性的特殊情況 52
明確函式的多重用途 54
-- 在ECMAScript 5中判斷函式被調用的方法 54
-- 元屬性(Metaproperty)new.target 55
塊級函式 57
-- 塊級函式的使用場景 58
-- 非嚴格模式下的塊級函式 58
箭頭函式 59
-- 箭頭函式語法 60
-- 創建立即執行函式表達式 62
-- 箭頭函式沒有this綁定 63
-- 箭頭函式和數組 65
-- 箭頭函式沒有arguments綁定 66
-- 箭頭函式的辨識方法 66
尾調用最佳化 67
-- ECMAScript 6中的尾調用最佳化 68
-- 如何利用尾調用最佳化 69
小結 71
第4章 擴展對象的功能性 72
對象類別 72
對象字面量語法擴展 73
-- 屬性初始值的簡寫 73
-- 對象方法的簡寫語法 74
-- 可計算屬性名(Computed Property Name) 75
新增方法 76
-- Object.is()方法 76
-- Object.assign()方法 77
重複的對象字面量屬性 80
自有屬性枚舉順序 81
增強對象原型 82
-- 改變對象的原型 82
-- 簡化原型訪問的Super引用 83
正式的方法定義 86
小結 88
第5章 解構:使數據訪問更便捷 89
為何使用解構功能 89
對象解構 90
-- 解構賦值 91
-- 默認值 92
-- 為非同名局部變數賦值 93
-- 嵌套對象解構 94
數組解構 96
-- 解構賦值 97
-- 默認值 99
-- 嵌套數組解構 99
-- 不定元素 99
混合解構 101
解構參數 102
-- 必須傳值的解構參數 103
-- 解構參數的默認值 104
小結 106
第6章 Symbol和Symbol屬性 107
創建Symbol 107
Symbol的使用方法 109
Symbol共享體系 110
Symbol與類型強制轉換 112
Symbol屬性檢索 112
通過well-known Symbol暴露內部操作 113
-- Symbol.hasInstance方法 114
-- Symbol.isConcatSpreadable屬性 116
-- Symbol.match、Symbol.replace、Symbol.search和Symbol.split屬性 118
-- Symbol.toPrimitive方法 120
-- Symbol.toStringTag屬性 122
-- Symbol.unscopables屬性 125
小結 127
第7章 Set集合與Map集合 128
ECMAScript 5中的Set集合與Map集合 129
該解決方案的一些問題 129
ECMAScript 6中的Set集合 131
-- 創建Set集合併添加元素 131
-- 移除元素 133
-- Set集合的forEach()方法 133
-- 將Set集合轉換為數組 136
-- Weak Set集合 136
ECMAScript 6中的Map集合 139
-- Map集合支持的方法 140
-- Map集合的初始化方法 141
-- Map集合的forEach()方法 142
-- Weak Map集合 143
小結 147
第8章 疊代器(Iterator)和生成器(Generator) 149
循環語句的問題 149
什麼是疊代器 150
什麼是生成器 151
-- 生成器函式表達式 153
-- 生成器對象的方法 154
可疊代對象和for-of循環 155
-- 訪問默認疊代器 156
-- 創建可疊代對象 157
內建疊代器 158
-- 集合對象疊代器 158
-- 字元串疊代器 163
-- NodeList疊代器 164
展開運算符與非數組可疊代對象 165
高級疊代器功能 166
-- 給疊代器傳遞參數 166
-- 在疊代器中拋出錯誤 168
-- 生成器返回語句 170
-- 委託生成器 171
異步任務執行 174
-- 簡單任務執行器 174
-- 向任務執行器傳遞數據 176
-- 異步任務執行器 177
小結 180
第9章 JavaScript中的類 181
ECMAScript 5中的近類結構 181
類的聲明 182
-- 基本的類聲明語法 182
-- 為何使用類語法 184
類表達式 186
-- 基本的類表達式語法 186
-- 命名類表達式 187
作為一等公民的類 189
訪問器屬性 190
可計算成員名稱 192
生成器方法 193
靜態成員 195
繼承與派生類 196
-- 類方法遮蔽 199
-- 靜態成員繼承 199
-- 派生自表達式的類 200
-- 內建對象的繼承 203
-- Symbol.species屬性 205
在類的構造函式中使用new.target 208
小結 210
第10章 改進的數組功能 211
創建數組 211
-- Array.of()方法 212
-- Array.from()方法 213
為所有數組添加的新方法 216
-- find()方法和findIndex()方法 217
-- fill()方法 217
-- copyWithin()方法 218
定型數組 219
-- 數值數據類型 220
-- 數組緩衝區 221
-- 通過視圖運算元組緩衝區 221
定型數組與普通數組的相似之處 228
-- 通用方法 229
-- 相同的疊代器 230
-- of()方法和from()方法 230
定型數組與普通數組的差別 231
-- 行為差異 231
-- 缺失的方法 232
-- 附加方法 233
小結 234
第11章 Promise與異步編程 235
異步編程的背景知識 235
-- 事件模型 236
-- 回調模式 236
Promise的基礎知識 239
-- Promise的生命周期 239
-- 創建未完成的Promise 242
-- 創建已處理的Promise 244
-- 執行器錯誤 247
全局的Promise拒絕處理 248
Node.js環境的拒絕處理 248
瀏覽器環境的拒絕處理 251
串聯Promise 253
-- 捕獲錯誤 254
-- Promise鏈的返回值 255
-- 在Promise鏈中返回Promise 256
回響多個Promise 259
-- Promise.all()方法 259
-- Promise.race()方法 260
自Promise繼承 262
基於Promise的異步任務執行 263
小結 267
第12章 代理(Proxy)和反射(Reflection)API 269
數組問題 269
代理和反射 270
創建一個簡單的代理 271
使用set陷阱驗證屬性 272
用get陷阱驗證對象結構(Object Shape) 274
使用has陷阱隱藏已有屬性 275
用deleteProperty陷阱防止刪除屬性 277
原型代理陷阱 279
-- 原型代理陷阱的運行機制 279
-- 為什麼有兩組方法 281
對象可擴展性陷阱 282
-- 兩個基礎示例 283
-- 重複的可擴展性方法 284
屬性描述符陷阱 285
-- 給Object.defineProperty()添加限制 286
-- 描述符對象限制 287
-- 重複的描述符方法 288
ownKeys陷阱 290
函式代理中的apply和construct陷阱 291
-- 驗證函式參數 292
-- 不用new調用構造函式 294
-- 覆寫抽象基類構造函式 296
-- 可調用的類構造函式 297
可撤銷代理 298
解決數組問題 299
-- 檢測數組索引 300
-- 添加新元素時增加length的值 300
-- 減少length的值來刪除元素 302
-- 實現MyArray類 304
將代理用作原型 307
-- 在原型上使用get陷阱 307
-- 在原型上使用set陷阱 308
-- 在原型上使用has陷阱 309
-- 將代理用作類的原型 310
小結 314
第13章 用模組封裝代碼 315
什麼是模組 315
導出的基本語法 316
導入的基本語法 317
-- 導入單個綁定 318
-- 導入多個綁定 318
-- 導入整個模組 318
-- 導入綁定的一個微妙怪異之處 320
導出和導入時重命名 320
模組的默認值 321
-- 導出默認值 321
-- 導入默認值 322
重新導出一個綁定 323
無綁定導入 324
載入模組 325
-- 在Web瀏覽器中使用模組 325
-- 瀏覽器模組說明符解析 329
小結 330
附錄A ECMAScript 6中較小的改動 331
附錄B 了解ECMAScript 7(2016) 337
索引 343