深入理解ES6

深入理解ES6

《深入理解ES6》 一書原作者Nicholas C. Zakas(尼古拉斯·澤卡斯),中文版由劉振濤譯,電子工業出版社2017年7月出版

內容提要

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

相關詞條

相關搜尋

熱門詞條

聯絡我們