深入理解ES6 ( 簡體 字) |
作者:劉振濤 | 類別:1. -> 程式設計 -> 網路編程 -> Javascript |
譯者: |
出版社:電子工業出版社 | 3dWoo書號: 47087 詢問書籍請說出此書號!【缺書】 NT售價: 495 元 |
出版日:6/1/2017 |
頁數:396 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787121317989 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:序 ECMAScript 6如暴風雨般驟臨世界,人們期待已久而它卻突然出現,傳播之快始料未及。每個人都與ECMAScript 6有著一段不同的故事,以下是我的故事。 2013年,我還在一家創業公司工作,正在從iOS轉向Web研發,之后我參加了JavaScript開源社區并共同創建了Redux。當時我正在努力學習Web開發,而且我非常害怕,我的團隊必須在短短幾個月的時間內將我們的產品用JavaScript 重構為Web版。 起初我認為用JavaScript編寫大型軟件的想法很可笑,但是一名團隊成員說服了我,他說JavaScript不是一門玩具語言。我同意撇開成見試一試,于是打開MDN和StackOverflow首次深入學習JavaScript。我對這門簡約的語言著了迷,我的同事還教我如何使用工具,例如代碼整理工具(linter)和代碼合并工具(bundler) 。在這幾個星期里我恍然大悟,原來我如此喜歡編寫JavaScript代碼。 但沒有一門語言是完美的,由于使用過其他語言,我非常希望JavaScript也可以頻繁更新,但在這10年間,ECMAScript 5是唯一的重大更新,它只實現了一小部分特性,完全支持瀏覽器需要數10年的時間。彼時,即將到來的代號為Harmony的ECMAScript 6(ES6)規范尚未完成,遙遙無期。“也許在10年內我能夠寫一些ECMAScript 6代碼吧。”我想。 一些實驗性的“轉譯器(Transpiler)”,如谷歌的Traceur,可以將代碼從ECMAScript 6轉換成ECMAScript 5。它們大多功能非常有限,或難以插入現有的JavaScript構建管道。但是,隨后出現的新型轉譯器 6to5改變了一切。它易于安裝,可以很好地集成在現有的工具中,生成的代碼可讀,于是其像野火般蔓延開來。6to5現在被稱作Babel,在標準定稿前就開始為主流受眾提供ECMAScript 6的特性。幾個月以來,ECMAScript 6無處不在。 出于各種原因,ECMAScript 6已經把社區割裂開來。正如本書所講,在許多主流瀏覽器中ECMAScript 6仍未完全實現。當你學習這門語言時,不得不進行的構建步驟足以使人退縮。一些庫的文檔和示例中有ECMAScript 6的代碼,你可能想知道這些庫是否可以在ECMAScript 5環境中使用。這令人感到困惑,由于這門語言之前幾乎從未改變過,因此許多人對于新特性的加入并沒有十分期待,而有一部分人在焦急地等待新功能的到來,并希望所有的這些新功能能放在一起使用—在某些情況下,甚至為了使用而使用,不管是否必要。 正當我對JavaScript的使用逐漸熟練時,我感覺再往前走很困難,我不得不學習一門新的語言。那幾個月的時間里我感到很糟糕。最后在圣誕節前夕,我開始閱讀本書的草稿,我簡直愛不釋手,在凌晨3點,當參加聚會的每一位成員都已熟睡,而我卻理解了ECMAScript 6! Nicholas是一位非常有天賦的老師。他以直截了當的方式傳達深刻的細節,讓你能夠理解所有這些知識。除了本書之外,他也因創建ESLint而出名,這是一個被下載了數百萬次的JavaScript代碼分析器。 Nicholas對JavaScript的了解程度很少有人能夠企及,所以不要錯過吸取新知識的機會。閱讀本書,你將對掌握ECMAScript 6充滿信心。
Dan Abramov React核心團隊成員及Redux的創造者
前言 JavaScript核心的語言特性是在標準ECMA-262中被定義的。該標準中定義的語言被稱作ECMAScript,它是JavaScript的子集。在瀏覽器與Node.js環境中通過附加的對象和方法可添加更多新功能,而JavaScript的核心依然保持ECMAScript的定義。總的來說,ECMA-262標準的持續發展對于JavaScript的成功功不可沒。ECMAScript 6是JavaScript最新的重大更新,本書將為你講解其中的改動。 ECMAScript 6之路 2007年,JavaScript走向了發展中的轉折點,逐漸興起的Ajax開創了動態Web應用的新時代,而自1999年第三版ECMA-262發布以來,JavaScript卻沒有絲毫改變。當時,負責推動ECMAScript 語言發展的TC-39委員會將大量規范草案整合在了ECMAScript 4中,新增的語言特性涉足甚廣,包括:模塊、類、類繼承、私有對象成員、可選類型注釋及眾多其他的特性。 然而,TC-39組織內部對ECMAScript 4的動議草案產生了巨大分歧,部分成員認為不應該一次性在第四版標準中加入過多的新功能,而來自雅虎、谷歌和微軟的技術負責人則共同商討并提交了一份“ECMAScript 3.1”草案作為下一代ECMAScript的可選方案,此處的“3.1”意在表明只是對現有標準進行小幅的增量修改。 ECMAScript 3.1引入的語法變化極少,這一版標準相對而言更專注于優化屬性特性,支持原生JSON,以及為已有對象增添新的方法。委員會曾經嘗試融合ECMAScript 3.1與ECMAScript 4,但由于對峙雙方對語言未來的發展方向分歧過大,最后以失敗告終。 到了2008年,JavaScript創始人Brendan Eich宣布TC-39委員會將合力推進ECMAScript 3.1的標準化工作。他們選擇將ECMAScript 4中提出的大部分針對語法及特性的改動暫時擱置,到下一個版本ECMAScript的標準化工作完成之后,委員會全體成員再努力融合ECMAScript 3.1和4中的精華,他們還給這個版本起了一個昵稱—ECMAScript Harmony(取和諧之意)。 經過標準化的ECMAScript 3.1最終作為ECMA-262第五版正式發布,它同時也被稱為 ECMAScript 5。委員會表示他們永不發布第四版,以避免與從未面世的“ECMAScript 4”產生命名沖突。基于ECMAScript Harmony的工作隨后陸續展開,繼承了精華的ECMAScript 6將成為繼ECMAScript 5之后發布的首個新標準。 ECMAScript 6標準的特性已于2015年全部完成,并被正式命名為“ECMAScript 2015”(由于開發者們對ECMAScript 6更為熟悉,因此本書將繼續沿用此稱謂)。新標準的變化俯拾即是,大到全新的對象和模式、大幅的語法改動,小到為已有對象擴充新的方法。更令人激動的是,ECMAScript 6中點滴的變化全都致力于解決開發者實際工作中遇到的問題。 關于本書 深入理解ECMAScript 6的特性對于所有JavaScript開發人員來說至關重要,在可預見的未來,ECMAScript 6中引入的語言特性將構成構建JavaScript應用程序的基礎。這也是本書的初衷,筆者希望你通過閱讀本書來了解ECMAScript 6的新特性,并在需要時隨時能夠予以使用。 瀏覽器與Node.js中的兼容性 開發者們正積極地為Web瀏覽器及Node.js這些JavaScript的宿主環境添加ECMAScript 6的新功能。本書只關注規范中定義的正確行為,不會對比每種實現間的差異。如此一來,讀者所使用的JavaScript環境有可能與本書中描述的不一致。 本書的目標讀者 本書是專門為熟悉JavaScript和ECMAScript 5的讀者準備的指南,幫助大家理解ECMAScript 5和6之間的差異。對ECMAScript 6早已熟稔于心的讀者不必繼續閱讀下去。本書特別適合想了解語言未來特性的JavaScript中高級開發者,無論你的工作環境是Node.js還是Web瀏覽器,本書都非常適合你。 本書不適合從未寫過JavaScript代碼的初學者,讀者們需要對這門語言的基礎知識有一定的理解,這樣才能發揮本書的最大效用。 本書概覽 本書中的每一個章節與附錄都涵蓋有ECMAScript 6的不同方面,許多章節一開始都會討論ECMAScript 6 中新變化的來龍去脈,以及這些改動試圖解決的問題。所有章節都包含代碼示例來幫助你學習新的語法及概念。
? 第1章 塊級作用域綁定 討論var在塊級作用域中的替代方案—let和const。 ? 第2章 字符串和正則表達式 詳盡介紹字符串模板,以及新增的操作與檢查字符串的功能。 ? 第3章 函數 討論函數的多處改動,包括箭頭函數(Arrow Function)、默認參數(Default Parameters)、不定參數(Rest Parameters)等。 ? 第4章 擴展對象的功能性 解讀對象創建、修改及使用方面的改動,包括對象字面量語法的變化、新的反射方法等。 ? 第5章 解構:使數據訪問更便捷 介紹一種通過簡明的語法分解對象和數組的方法—對象和數組解構。 ? 第6章 Symbol和Symbol屬性 介紹定義屬性的新途徑—Symbol。Symbol是一種新的原始類型,可用于創建外部無法直接訪問的對象屬性和方法。 ? 第7章 Set集合與Map集合 詳述四種新的集合類型:Set、WeakSet、Map及WeakMap。這些類型為數組增添了新的語義、去重機制,以及專門為JavaScript設計的內存管理機制,極大地擴展了數組的實用性。 ? 第8章 迭代器(Iterator)和生成器(Generator) 這兩個全新的功能可以協助你更有效地處理集合數據,在早期版本的JavaScript中無法實現這樣的功能。 ? 第9章 JavaScript中的類 介紹JavaScript中首次正式加入的類概念。接觸過其他語言的開發者通常會對JavaScript的語法感到困惑,新增的類語法使JavaScript變得更易上手,而且對熱衷于JavaScript的開發者來說新的語法變得更加簡潔。 ? 第10章 改進數組的功能 詳述針對原生數組進行的改動,以及這些有趣的變化為開發者所帶來的新體驗。 ? 第11章 Promise與異步編程 介紹語言的新成員—Promise。它是草根群體不斷努力的結晶,由于各大JavaScript庫的鼎立支持,這一功能逐漸被廣大開發者所接受。ECMAScript 6正式將Promise納入標準并為其提供可用的Polyfill。 ? 第12章 代理(Proxy)和反射(Reflection)API 介紹正式加入JavaScript的反射API和新的代理對象,開發者可以通過代理對象攔截每一個在對象中執行的操作,代理也賦予了開發者空前的對象控制權,同樣也為定義新的交互模式帶來無限可能。 ? 第13章 用模塊封裝代碼 詳述JavaScript的官方模塊風格。加入這一定義旨在代替過去幾年中出現過的許多非正式的模塊定義風格。 ? 附錄A ECMAScript 6中較小的改動 涵蓋了ECMAScript 6中實現的其他改動,它們與每一章所涉及的主題關系不大,一般很少使用這些功能。 ? 附錄B 了解ECMAScript 7(2016) 描述了在ECMAScript 7中實現的三個附加功能,它們在近期的影響力不會像ECMAScript 6一樣大。 |
內容簡介:ES6是迄今為止JavaScript內核首當其沖的一次重大更新。本書是領域大家Nicholas C. Zakas撰寫的一份ES6的完整指南,書中詳細講解了ES 6在JavaScript對象類型、語法及其他方面激動人心的改變。每一章都含有可運行于任何JavaScript環境的示例代碼,你可以利用這些代碼測試、理解ES6中的新功能。無論你是Web開發者還是Node.js開發者,都可以通過本書來更好地理解和運用ES6,或是順利地從ES5遷移到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
|
序: |