|
-- 會員 / 註冊 --
|
|
|
|
ES6標準入門(第3版) ( 簡體 字) |
作者:阮一峰 | 類別:1. -> 程式設計 -> 綜合 |
譯者: |
出版社:電子工業出版社 | 3dWoo書號: 47536 詢問書籍請說出此書號!【缺書】 NT售價: 495 元 |
出版日:9/1/2017 |
頁數:576 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787121324758 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:第3版前言 4年前,當我開始寫這本書的時候,ECMAScript 5.1版剛剛開始普及,最流行的框架還是jQuery。ES6看上去就像一個遙遠的藍圖,無人知道何時會實現。 僅僅4年,ES6已經經歷了ES2015、ES2016、ES2017這3個版本的迭代,各種實現的支持度已經超過90%,不僅可以實現網頁的編寫,還可以實現服務器腳本、手機App和桌面應用的編寫。程序員們完全接受了這個標準,甚至大量使用尚未標準化的新語法。JavaScript語言就像一列高鐵,以令人“眩暈”的速度向前沖刺。 互聯網行業的蓬勃興旺造就了ES6的成功,也使得這本教程不斷更新,越寫越厚。第2版問世18個月之后,不得不推出第3版。 第3版新增了超過30%的內容,完全覆蓋了ES2017標準(第2版只做到覆蓋 ES2015標準),并且對所有章節都進行了修訂,文字表達更準確易懂,示例更豐富。對讀者來說,這個版本更容易學習,更有參考價值。 這4年來,我對ES6的理解和所有的學習筆記,都濃縮在這本教程里面。那些我自己感到最困難的地方,書中都做出了詳細講解,給出了細致的示例,我相信這也是其他國內學習者所需要的。 這本教程當然也包含了些許局限,以及細致檢查之后仍然疏漏的各種錯誤。一旦發現,我會第一時間更正。讀者可以到官方倉庫github.com/ruanyf/es6tutorial中查看勘誤。 我在微博上曾經說過一段話,就把它放在這里作為結束吧。 “我水平其實不高,只是好奇心重,從沒想到這么多人會關注。希望不要讓大家失望,未來做一塊墊腳石,為需要的朋友提供幫助,為技術的推廣和發展做出力所能及的貢獻。” 阮一峰 2017年8月1日,寫于杭州
第1版前言 2012年年底,我開始動手做一個開源項目《JavaScript標準參考教程》(github.com/ruanyf/ jstutorial)。原來的設想是將自己的學習筆記整理成一本書,哪里料到,這個項目不斷膨脹,最后變成了ECMAScript 5及其外圍API的全面解讀和參考手冊,寫了一年多還沒寫完。 那個項目的最后一章就是ECMAScript 6的語法簡介。那一章也是越寫越長,最后我不得不決定,把它獨立出來,作為一個新項目,也就是您現在看到的這本書。 JavaScript已經是互聯網開發的第一大語言,而且正在變成一種全領域的語言。著名程序員Jeff Atwood甚至提出了一條“Atwood定律”:“所有可以用JavaScript編寫的程序,最終都會出現JavaScript的版本。”(Any application that can be written in JavaScript will eventually be written in JavaScript.) ECMAScript正是JavaScript的國際標準,這就決定了該標準的重要性。而ECMAScript 6是ECMAScript歷史上最大的一次版本升級,在語言的各個方面都有極大的變化,即使是熟練的JavaScript程序員,也需要重新學習。由于ES6的設計目標是企業級開發和大型項目,所以可以預料,除了互聯網開發者,將來還會有大量應用程序開發者(甚至操作系統開發者)成為ES6的學習者。 我寫作這本書的目標,就是想為上面這些學習者提供一本篇幅較短、簡明易懂、符合中文表達習慣的ES6教程。它由淺入深、循序漸進,既有重要概念的講解,又有API接口的羅列,便于日后當作參考手冊查閱,還提供大量示例代碼,讓讀者不僅一看就懂,還能舉一反三,直接復制用于實際項目之中。 需要聲明的是,為了突出重點,本書只涉及ES6與ES5的不同之處,不對JavaScript已有的語法進行全面講解,畢竟市面上這樣的教程已經有很多了。因此,本書不是JavaScript入門教材,不適合初學者。閱讀本書之前,需要對JavaScript的基本語法有所了解。 我本人也是一個ES6的學習者,不敢說自己有多高的水平,只是較早地接觸了這個主題,持續地讀了許多資料,追蹤標準的進展,做了詳細的筆記而已。雖然我盡了最大努力,并且原稿在GitHub上公開后已經得到了大量的勘誤,但是本書的不盡如人意之處恐怕還有不少。 歡迎大家訪問本書的項目主頁(github.com/ruanyf/es6tutorial),提出意見,提交pull request。這些都會包括在本書的下一個版本中。 阮一峰 2014年6月4日,寫于上海 |
內容簡介: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 |
序: |
|