ES6標準入門(第3版)

ES6標準入門(第3版)

《ES6標準入門(第3版)》 一書作者阮一峰,電子工業出版社2017年9月出版

內容提要

ES6是下一代JavaScript語言標準的統稱,每年6月發布一次修訂版,迄今為止已經發布了3個版本,分別是ES2015、ES2016、ES2017。本書根據ES2017標準,詳盡介紹了所有新增的語法,對基本概念、設計目的和用法進行了清晰的講解,給出了大量簡單易懂的示例。本書為中級難度,適合那些已經對JavaScript語言有一定了解的讀者,可以作為學習這門語言最新進展的工具書,也可以作為參考手冊供大家隨時查閱新語法。 第3版增加了超過30%的內容,完全覆蓋了ES2017標準,相比第2版介紹了更多的語法點,還調整了原有章節的文字表達,充實了示例,論述更準確,更易懂易學。

目錄

第1章 ECMAScript 6簡介 1

1.1 ECMAScript和JavaScript的關係 1

1.2 ES6與ECMAScript 2015的關係 1

1.3 語法提案的批准流程 2

1.4 ECMAScript的歷史 3

1.5 部署進度 4

1.6 Babel 轉碼器 4

1.6.1 配置檔案.babelrc 5

1.6.2 命令行轉碼babel-cli 6

1.6.3 babel-node 7

1.6.4 babel-register 8

1.6.5 babel-core 8

1.6.6 babel-polyfill 9

1.6.7 瀏覽器環境 10

1.6.8 線上轉換 10

1.6.9 與其他工具的配合 11

1.7 Traceur轉碼器 11

1.7.1 直接插入網頁 12

1.7.2 線上轉換 13

1.7.3 命令行轉換 14

1.7.4 Node環境的用法 15

第2章 let和const命令 17

2.1 let 命令 17

2.1.1 基本用法 17

2.1.2 不存在變數提升 19

2.1.3 暫時性死區 19

2.1.4 不允許重複聲明 21

2.2 塊級作用域 22

2.2.1 為什麼需要塊級作用域 22

2.2.2 ES6的塊級作用域 23

2.2.3 塊級作用域與函式聲明 24

2.2.4 do表達式 27

2.3 const命令 28

2.3.1 基本用法 28

2.3.2 本質 29

2.3.3 ES6聲明變數的6種方法 30

2.4 頂層對象的屬性 30

2.5 global對象 31

第3章 變數的解構賦值 33

3.1 數組的解構賦值 33

3.1.1 基本用法 33

3.1.2 默認值 35

3.2 對象的解構賦值 37

3.3 字元串的解構賦值 41

3.4 數值和布爾值的解構賦值 41

3.5 函式參數的解構賦值 42

3.6 圓括弧問題 43

3.6.1 不能使用圓括弧的情況 43

3.6.2 可以使用圓括弧的情況 44

3.7 用途 44

第4章 字元串的擴展 49

4.1 字元的Unicode表示法 49

4.2 codePointAt() 50

4.3 String.fromCodePoint() 52

4.4 字元串的遍歷器接口 52

4.5 at() 53

4.6 normalize() 53

4.7 includes()、startsWith()、endsWith() 54

4.8 repeat() 55

4.9 padStart()、padEnd() 56

4.10 模板字元串 57

4.11 實例:模板編譯 60

4.12 標籤模板 62

4.13 String.raw() 67

4.14 模板字元串的限制 68

第5章 正則的擴展 71

5.1 RegExp構造函式 71

5.2 字元串的正則方法 72

5.3 u修飾符 72

5.4 y修飾符 74

5.5 sticky屬性 77

5.6 flags屬性 77

5.7 s修飾符:dotAll模式 78

5.8 後行斷言 79

5.9 Unicode屬性類 80

5.10 具名組匹配 81

5.10.1 簡介 81

5.10.2 解構賦值和替換 82

5.10.3 引用 83

第6章 數值的擴展 85

6.1 二進制和八進制表示法 85

6.2 Number.isFinite()、Number.isNaN() 86

6.3 Number.parseInt()、Number.parseFloat() 87

6.4 Number.isInteger() 88

6.5 Number.EPSILON 88

6.6 安全整數和Number.isSafeInteger() 89

6.7 Math對象的擴展 92

6.7.1 Math.trunc() 92

6.7.2 Math.sign() 92

6.7.3 Math.cbrt() 93

6.7.4 Math.clz32() 94

6.7.5 Math.imul() 95

6.7.6 Math.fround() 95

6.7.7 Math.hypot() 96

6.7.8 對數方法 96

6.7.9 雙曲函式方法 98

6.8 Math.signbit() 98

6.9 指數運算符 99

6.10 Integer數據類型 99

6.10.1 簡介 99

6.10.2 運算 100

第7章 函式的擴展 103

7.1 函式參數的默認值 103

7.1.1 基本用法 103

7.1.2 與解構賦值默認值結合使用 105

7.1.3 參數默認值的位置 107

7.1.4 函式的length屬性 108

7.1.5 作用域 108

7.1.6 套用 111

7.2 rest參數 112

7.3 嚴格模式 113

7.4 name屬性 115

7.5 箭頭函式 116

7.5.1 基本用法 116

7.5.2 注意事項 118

7.5.3 嵌套的箭頭函式 121

7.6 綁定this 123

7.7 尾調用最佳化 124

7.7.1 什麼是尾調用 124

7.7.2 尾調用最佳化 125

7.7.3 尾遞歸 126

7.7.4 遞歸函式的改寫 128

7.7.5 嚴格模式 129

7.7.6 尾遞歸最佳化的實現 129

7.8 函式參數的尾逗號 132

第8章 數組的擴展 133

8.1 擴展運算符 133

8.1.1 含義 133

8.1.2 替代數組的apply方法 134

8.1.3 擴展運算符的套用 136

8.2 Array.from() 139

8.3 Array.of() 142

8.4 數組實例的copyWithin() 143

8.5 數組實例的find()和findIndex() 144

8.6 數組實例的fill() 145

8.7 數組實例的entries()、keys()和values() 145

8.8 數組實例的includes() 146

8.9 數組的空位 147

第9章 對象的擴展 151

9.1 屬性的簡潔表示法 151

9.2 屬性名表達式 154

9.3 方法的name屬性 156

9.4 Object.is() 157

9.5 Object.assign() 158

9.5.1 基本用法 158

9.5.2 注意點 160

9.5.3 常見用途 161

9.6 屬性的可枚舉性 163

9.7 屬性的遍歷 165

9.8 __proto__ 屬性、Object.setPrototypeOf()、Object.getPrototypeOf() 166

9.8.1 __proto__ 屬性 166

9.8.2 Object.setPrototypeOf() 167

9.8.3 Object.getPrototypeOf() 168

9.9 Object.keys()、Object.values()、Object.entries() 169

9.9.1 Object.keys() 169

9.9.2 Object.values() 170

9.9.3 Object.entries 171

9.10 對象的擴展運算符 173

9.11 Object.getOwnPropertyDescriptors() 177

9.12 Null傳導運算符 181

第10章 Symbol 183

10.1 概述 183

10.2 作為屬性名的Symbol 185

10.3 實例:消除魔術字元串 188

10.4 屬性名的遍歷 189

10.5 Symbol.for()、Symbol.keyFor() 191

10.6 實例:模組的Singleton模式 192

10.7 內置的Symbol值 194

10.7.1 Symbol.hasInstance 194

10.7.2 Symbol.isConcatSpreadable 195

10.7.3 Symbol.species 196

10.7.4 Symbol.match 197

10.7.5 Symbol.replace 197

10.7.6 Symbol.search 198

10.7.7 Symbol.split 198

10.7.8 Symbol.iterator 199

10.7.9 Symbol.toPrimitive 200

10.7.10 Symbol.toStringTag 201

10.7.11 Symbol.unscopables 202

第11章 Set和Map數據結構 205

11.1 Set 205

11.1.1 基本用法 205

11.1.2 Set實例的屬性和方法 207

11.1.3 遍歷操作 208

11.2 WeakSet 212

11.2.1 含義 212

11.2.2 語法 212

11.3 Map 214

11.3.1 含義和基本用法 214

11.3.2 實例的屬性和操作方法 218

11.3.3 遍歷方法 220

11.3.4 與其他數據結構的互相轉換 222

11.4 WeakMap 225

11.4.1 含義 225

11.4.2 WeakMap的語法 227

11.4.3 WeakMap示例 228

11.4.4 WeakMap的用途 229

第12章 Proxy 233

12.1 概述 233

12.2 Proxy實例的方法 237

12.2.1 get() 237

12.2.2 set() 241

12.2.3 apply() 243

12.2.4 has() 244

12.2.5 construct() 246

12.2.6 deleteProperty() 247

12.2.7 defineProperty() 248

12.2.8 getOwnPropertyDescriptor() 248

12.2.9 getPrototypeOf() 249

12.2.10 isExtensible() 249

12.2.11 ownKeys() 250

12.2.12 preventExtensions() 254

12.2.13 setPrototypeOf() 255

12.3 Proxy.revocable() 255

12.4 this問題 256

12.5 實例:Web服務的客戶端 258

第13章 Reflect 259

13.1 概述 259

13.2 靜態方法 261

13.2.1 Reflect.get(target, name, receiver) 262

13.2.2 Reflect.set(target, name, value, receiver) 263

13.2.3 Reflect.has(obj, name) 264

13.2.4 Reflect.deleteProperty(obj, name) 265

13.2.5 Reflect.construct(target, args) 265

13.2.6 Reflect.getPrototypeOf(obj) 265

13.2.7 Reflect.setPrototypeOf(obj, newProto) 266

13.2.8 Reflect.apply(func, thisArg, args) 267

13.2.9 Reflect.defineProperty(target, propertyKey, attributes) 267

13.2.10 Reflect.getOwnPropertyDescriptor (target, propertyKey) 268

13.2.11 Reflect.isExtensible (target) 268

13.2.12 Reflect.preventExtensions(target) 269

13.2.13 Reflect.ownKeys (target) 269

13.3 實例:使用Proxy實現觀察者模式 270

第14章 Promise對象 273

14.1 Promise的含義 273

14.2 基本用法 274

14.3 Promise.prototype.then() 278

14.4 Promise.prototype.catch() 279

14.5 Promise.all() 285

14.6 Promise.race() 287

14.7 Promise.resolve() 288

14.8 Promise.reject() 290

14.9 兩個有用的附加方法 291

14.9.1 done() 291

14.9.2 finally() 292

14.10 套用 292

14.10.1 載入圖片 292

14.10.2 Generator函式與Promise的結合 293

14.11 Promise.try() 294

第15章 Iterator和for...of循環 297

15.1 Iterator(遍歷器)的概念 297

15.2 默認Iterator接口 300

15.3 調用Iterator接口的場合 305

15.4 字元串的Iterator接口 307

15.5 Iterator接口與Generator函式 308

15.6 遍歷器對象的return()、throw() 309

15.7 for...of循環 310

15.7.1 數組 310

15.7.2 Set和Map結構 311

15.7.3 計算生成的數據結構 312

15.7.4 類似數組的對象 313

15.7.5 對象 314

15.7.6 與其他遍歷語法的比較 315

第16章 Generator函式的語法 317

16.1 簡介 317

16.1.1 基本概念 317

16.1.2 yield表達式 319

16.1.3 與Iterator接口的關係 322

16.2 next方法的參數 323

16.3 for...of循環 325

16.4 Generator.prototype.throw() 328

16.5 Generator.prototype.return() 334

16.6 yield*表達式 335

16.7 作為對象屬性的Generator函式 342

16.8 Generator函式this 342

16.9 含義 345

16.9.1 Generator與狀態機 345

16.9.2 Generator與協程 346

16.10 套用 347

16.10.1 異步操作的同步化表達 347

16.10.2 控制流管理 348

16.10.3 部署Iterator接口 351

16.10.4 作為數據結構 352

第17章 Generator函式的異步套用 355

17.1 傳統方法 355

17.2 基本概念 355

17.2.1 異步 355

17.2.2 回調函式 356

17.2.3 Promise 356

17.3 Generator函式 357

17.3.1 協程 357

17.3.2 協程的Generator函式實現 358

17.3.3 Generator函式的數據交換和錯誤處理 359

17.3.4 異步任務的封裝 360

17.4 Thunk函式 361

17.4.1 參數的求值策略 361

17.4.2 Thunk函式的含義 362

17.4.3 JavaScript語言的Thunk函式 362

17.4.4 Thunkify模組 364

17.4.5 Generator函式的流程管理 365

17.4.6 Thunk函式的自動流程管理 367

17.5 co模組 368

17.5.1 基本用法 368

17.5.2 co模組的原理 369

17.5.3 基於Promise對象的自動執行 369

17.5.4 co模組的源碼 371

17.5.5 處理並發的異步操作 372

17.6 實例:處理 Stream 373

第18章 async函式 375

18.1 含義 375

18.2 用法 377

18.3 語法 379

18.3.1 返回Promise對象 379

18.3.2 Promise對象的狀態變化 379

18.3.3 await命令 380

18.3.4 錯誤處理 382

18.3.5 使用注意點 383

18.4 async函式的實現原理 386

18.5 其他異步處理方法的比較 387

18.6 實例:按順序完成異步操作 388

18.7 異步遍歷器 390

18.7.1 異步遍歷的接口 390

18.7.2 for await...of 392

18.7.3 異步Generator函式 393

18.7.4 yield*語句 398

第19章 Class的基本語法 399

19.1 簡介 399

19.2 嚴格模式 403

19.3 constructor方法 403

19.4 類的實例對象 404

19.5 Class表達式 406

19.6 不存在變數提升 407

19.7 私有方法 408

19.8 私有屬性 409

19.9 this的指向 410

19.10 name屬性 412

19.11 Class的取值函式(getter)和存值函式(setter) 412

19.12 Class的Generator方法 413

19.13 Class的靜態方法 414

19.14 Class的靜態屬性和實例屬性 415

19.14.1 Class的實例屬性 416

19.14.2 Class的靜態屬性 417

19.15 new.target屬性 418

第20章 Class的繼承 421

20.1 簡介 421

20.2 Object.getPrototypeOf() 423

20.3 super關鍵字 423

20.4 類的prototype屬性和 __proto__ 屬性 429

20.4.1 extends的繼承目標 430

20.4.2 實例的 __proto__ 屬性 432

20.5 原生構造函式的繼承 432

20.6 Mixin模式的實現 436

第21章 修飾器 439

21.1 類的修飾 439

21.2 方法的修飾 442

21.3 為什麼修飾器不能用於函式 444

21.4 core-decorators.js 446

21.5 使用修飾器實現自動發布事件 449

21.6 Mixin 450

21.7 Trait 453

21.8 Babel轉碼器的支持 456

第22章 Module的語法 457

22.1 概述 457

22.2 嚴格模式 458

22.3 export命令 459

22.4 import命令 462

22.5 模組的整體載入 464

22.6 export default命令 465

22.7 export與import的複合寫法 468

22.8 模組的繼承 469

22.9 跨模組常量 470

22.10 import() 471

22.10.1 簡介 471

22.10.2 適用場合 472

22.10.3 注意點 473

第23章 Module的載入實現 475

23.1 瀏覽器載入 475

23.1.1 傳統方法 475

23.1.2 載入規則 476

23.2 ES6模組與CommonJS模組的差異 477

23.3 Node載入 481

23.3.1 概述 481

23.3.2 import命令載入CommonJS模組 482

23.3.3 require命令載入ES6模組 484

23.4 循環載入 485

23.4.1 CommonJS模組的載入原理 485

23.4.2 CommonJS模組的循環載入 486

23.4.3 ES6模組的循環載入 488

23.5 ES6模組的轉碼 492

23.5.1 ES6 module transpiler 492

23.5.2 SystemJS 492

第24章 編程風格 495

24.1 塊級作用域 495

24.1.1 let取代var 495

24.1.2 全局常量和執行緒安全 496

24.2 字元串 497

24.3 解構賦值 497

24.4 對象 498

24.5 數組 500

24.6 函式 501

24.7 Map結構 503

24.8 Class 503

24.9 模組 504

24.10 ESLint的使用 506

第25章 讀懂ECMAScript規格 509

25.1 概述 509

25.2 相等運算符 510

25.3 數組的空位 511

25.4 數組的map方法 513

第26章 ArrayBuffer 517

26.1 ArrayBuffer對象 518

26.1.1 概述 518

26.1.2 ArrayBuffer.prototype.byteLength 520

26.1.3 ArrayBuffer.prototype.slice() 520

26.1.4 ArrayBuffer.isView() 520

26.2 TypedArray視圖 521

26.2.1 概述 521

26.2.2 構造函式 522

26.2.3 數組方法 524

26.2.4 位元組序 526

26.2.5 BYTES_PER_ELEMENT屬性 528

26.2.6 ArrayBuffer與字元串的互相轉換 528

26.2.7 溢出 529

26.2.8 TypedArray.prototype.buffer 531

26.2.9 TypedArray.prototype.byteLength、TypedArray. prototype.byteOffset 531

26.2.10 TypedArray.prototype.length 531

26.2.11 TypedArray.prototype.set() 532

26.2.12 TypedArray.prototype.subarray() 532

26.2.13 TypedArray.prototype.slice() 532

26.2.14 TypedArray.of() 533

26.2.15 TypedArray.from() 533

26.3 複合視圖 534

26.4 DataView視圖 535

26.5 二進制數組的套用 537

26.5.1 AJAX 537

26.5.2 Canvas 538

26.5.3 WebSocket 539

26.5.4 Fetch API 539

26.5.5 File API 539

26.6 SharedArrayBuffer 541

26.7 Atomics對象 543

熱門詞條

聯絡我們