最新IT書籍推介
ECMAScript是應用廣泛的語言,常被稱為JavaScript,但實際上後者是ECMAScript標準的實現和擴展,現在新的版本是ECMAScript 2018。系統學習和掌握ECMAScript語言規範是熟練應用JavaScript進行Web前端開發的關鍵。
ECMAScript語言規範幾乎每年都進行一次更新,在比較重要的更新版本ECMAScript 2015(也就是著名的ES6版)中,對JavaScript語言進行了大量的功能擴展和錯誤修正。本書基於ECMAScript 2018進行講解,掌握這些內容對Web前端開發人員順利使用JavaScript編程十分重要。
作者簡介
作者:黃燈橋
網名上將軍,資深Web技術專家,擁有10余年工作經驗,一直致力於Web開發框架的研究,近年來致力於於Ext JS框架的開發與推廣,撰寫了大量關於Ext JS開發相關的教程,是社區公認的先鋒和布道者,與Sencha 和Ext JS的官方開發團隊有十分緊密的聯系。精通C++等傳統的面向對象技術,而且還擅長ASP.NET、PHP和Java等Web開發技術。目前重點關註Sencha Touch、JQuery UI、HTML 5、CSS 3前端技術以及NoSQL數據庫技術。活躍於CSDN(博客專家)等各大技術社區,在社區內知名度極高,深受網友歡迎。著有經典著作《JavaScript淩厲開發——Ext詳解與實踐》、《Ext JS高級程序設計》、《Ext JS權威指南》和《Ext JS 6.2實戰》。
目 錄
第1章 變量與常量 1
1.1 var的問題 1
1.2 let語句 2
1.3 使用let的好處 2
1.3.1 避免重復聲明 2
1.3.2 避免變量未聲明就使用 3
1.3.3 避免全局變量成為全局對象的屬性 3
1.3.4 簡化代碼 3
1.3.5 模擬私有成員 4
1.4 const語句 5
1.5 建議的方式 6
1.6 小 結 6
第2章 表達式和運算符 7
2.1 解構賦值 7
2.1.1 自定義變量名 8
2.1.2 剩余項 8
2.1.3 默認值 9
2.1.4 函數參數 9
2.1.5 忽略某些數據 10
2.1.6 克隆數組 11
2.1.7 克隆對象 11
2.1.8 數據交換 11
2.1.9 返回多個值 12
2.2.1 右結合 13
2.2.2 帶歧義的冪運算 13
2.3 Math對象 13
2.4 小 結 14
第3章 字符串 15
3.1 四字節字符的定義方式 15
3.2 新增的方法 15
3.2.1 codePointAt方法 15
3.2.2 fromCodePoint方法 16
3.2.3 normalize方法 16
3.2.4 includes方法 17
3.2.5 startsWith方法 17
3.2.6 endsWith方法 18
3.2.7 repeat方法 18
3.2.8 padStart和padEnd方法 18
3.3 正則表達式 19
3.3.1 u標誌 19
3.3.2 y標誌 19
3.3.4 flags屬性 20
3.3.5 命名捕獲組 20
3.3.6 在後向引用中使用命名捕獲組 21
3.3.7 在替換中使用命名捕獲組 21
3.3.8 Unicode屬性轉義 21
3.3.9 後行斷言 22
3.4 模板字面量 22
3.4.1 語法 23
3.4.2 多行文本 24
3.4.3 嵌入數據 24
3.4.4 嵌套模板 24
3.4.5 帶標簽的模板字面量 26
3.4.6 原始值 26
3.4.7 轉義字符序列的功能修改 27
3.5 小 結 27
第4章 數字和符號 28
4.1 數 字 28
4.1.1 Number.isFinite() 28
4.1.2 Number.isNaN() 29
4.1.3 Number.parseInt()和Number.parseFloat() 29
4.1.4 Number.isInteger() 29
4.1.5 安全整型 30
4.2 符號 30
4.2.1 值的唯 一性 31
4.2.2 私有成員 31
4.2.3 獲取符號屬性 32
4.2.4 全局共享 33
4.3 眾所周知的符號 33
4.3.1 Symbol.hasInstance 33
4.3.2 Symbol.isConcatSpreadable 34
4.3.3 Symbol.iterator 35
4.3.4 Symbol.match 35
4.3.5 Symbol.replace 35
4.3.6 Symbol.search 35
4.3.7 Symbol.split 35
4.3.8 Symbol.species 35
4.3.9 Symbol.toPrimitive 36
4.3.10 Symbol.toStringTag 36
4.3.11 Symbol.unscopables 37
4.4 小 結 37
第5章 數組和類型化數組 39
5.1 新方法 39
5.1.1 of方法 39
5.1.2 from方法 40
5.1.3 find方法 40
5.1.4 findIndex方法 41
5.1.5 fill方法 41
5.1.6 copyWithin方法 41
5.1.7 includes方法 41
5.1.8 entries方法 42
5.1.9 keys方法 42
5.1.10 values方法 42
5.2 類型化數組 42
5.2.1 數據類型 42
5.2.2 數組緩沖區 43
5.2.3 數據視圖 43
5.2.4 類型化數組即視圖 45
5.2.5 類型化數組與數組的主要區別 45
5.3 小 結 46
第6章 對象 47
6.1 屬性簡寫 47
6.2 方法簡寫 47
6.3 未定的屬性名和方法名 48
6.4 新方法 49
6.4.1 is方法 49
6.4.2 assign方法 49
6.4.3 values方法 51
6.4.4 entries方法 52
6.4.5 getOwnPropertyDescriptors方法 52
6.5 原型 53
6.6 super關鍵字 54
6.7 小 結 55
第7章 函數 56
7.1 參數的默認值 56
7.1.1 設置默認值 56
7.1.2 參數默認值表達式 57
7.1.3 使用參數值作為默認值 57
7.1.4 使用參數值作為默認值表達式的參數 58
7.2 剩余參數 58
7.3 擴展運算符 59
7.4 name屬性 59
7.4.1 聲明函數 59
7.4.2 函數表達式 60
7.4.3 對象的方法 60
7.4.4 bind方法創建的函數 60
7.4.5 new Function創建的函數 60
7.4.6 實例 61
7.5 new.target屬性 61
7.6 在參數中使用尾後逗號 62
7.7 箭頭函數 62
7.7.1 基本語法 62
7.7.2 箭頭必須與參數在同一行 63
7.7.3 不綁定this 63
7.7.4 沒有arguments對象 65
7.7.5 定義方法時使用箭頭函數 65
7.7.6 不能用作構造函數 65
7.7.7 沒有原型 65
7.7.8 不能作為生成器 65
7.7.9 返回對象字面量 65
7.8 小 結 65
第8章 集合和映射 67
8.1 Set 67
8.1.1 基本語法 67
8.1.2 添加和刪除元素 67
8.1.3 清空Set 68
8.1.4 判斷某個值是否存在 68
8.1.5 遍歷 68
8.1.6 返回元素總數 68
8.1.7 轉換為數組 68
8.2 WeakSet 68
8.2.1 基本語法 69
8.2.2 添加和刪除元素 69
8.2.3 判斷某個值是否存在 69
8.2.4 不可遍歷 69
8.3 Map 69
8.3.1 基本語法 70
8.3.2 添加和刪除元素 70
8.3.3 獲取值 70
8.3.4 清空Map 71
8.3.5 判斷某個鍵是否存在 71
8.3.6 遍歷 71
8.3.7 返回元素總數 71
8.4 WeakMap 71
8.4.1 基本語法 71
8.4.2 添加和刪除元素 72
8.4.3 獲取值 72
8.4.4 判斷某個鍵是否存在 72
8.4.5 不可遍歷 72
8.5 小 結 72
第9章 叠代器和生成器 73
9.1 叠代器 73
9.1.1 內置叠代器 73
9.1.2 next方法 73
9.1.3 對象與叠代器 74
9.2 異步叠代器 74
9.3 生成器 74
9.3.1 基本語法 75
9.3.2 返回可叠代對象 75
9.3.3 在類或對象中定義生成器 75
9.3.4 高級生成器 76
9.3.5 拋出錯誤 78
9.3.6 return語句 78
9.3.7 任務隊列 79
9.3.8 異步生成器 81
9.4 for…of循環 81
9.5 for await…of循環 82
9.6 小 結 82
第10章 Promise對象與異步函數 83
10.1 Promise對象 83
10.1.1 基本語法 83
10.1.2 Promise的狀態 84
10.1.3 then方法 84
10.1.4 catch方法 85
10.1.5 all方法 85
10.1.6 race方法 86
10.1.7 resolve方法 86
10.1.8 reject方法 86
10.1.9 finally方法 86
10.2 異步函數 86
10.3 小 結 87
第11章 代理 88
11.1 Reflect對象 88
11.2 使用代理 89
11.3 可代理的操作 90
11.3.1 getPrototypeOf操作 90
11.3.2 setPrototypeOf操作 90
11.3.3 isExtensible操作 91
11.3.4 preventExtensions操作 91
11.3.5 getOwnPropertyDescriptor操作 91
11.3.6 defineProperty操作 92
11.3.7 has操作 92
11.3.8 get操作 93
11.3.9 set操作 94
11.3.10 deleteProperty操作 94
11.3.11 ownKeys操作 95
11.3.12 apply操作 96
11.3.13 construct操作 96
11.4 可撤銷的代理對象 97
11.5 小 結 97
第12章 類和模塊 98
12.1 類 98
12.1.1 類的聲明 98
12.1.2 類表達式 98
12.1.3 定義屬性 99
12.1.4 定義方法 99
12.1.5 訪問器屬性 99
12.1.6 靜態方法 100
12.1.7 繼承 100
12.1.8 使用super調用父類同名方法 100
12.2 模 塊 101
12.2.1 導出 101
12.2.2 導入 102
12.2.3 合並導出 103
12.2.4 無綁定的導入 103
12.3 模塊的加載 104
12.4 小 結 104
第13章 自己動手寫一個框架 105
13.1 框架的類型 105
13.2 開發工具 105
13.2.1 開發工具的選擇 105
13.2.2 安裝Visual Studio Code 106
13.2.3 配置開發環境 110
13.3 編寫框架 111
13.3.1 創建和配置項目 111
13.3.2 安裝Gulp 112
13.3.3 安裝Browserify 113
13.3.4 安裝Watchify 113
13.3.5 安裝Babel 113
13.3.6 安裝Uglify 114
13.3.7 配置Gulp 114
13.3.8 添加DOM操作 118
13.3.9 添加樣式操作 119
13.3.10 添加樣式類操作 122
13.3.11 添加屬性操作 123
13.3.12 添加事件操作 125
13.3.13 添加Ajax功能 127
13.4 小 結 129
序言
前 言
1994年,第一個比較成熟的瀏覽器Navigator(0.9版本)發布的時候,只是一個純瀏覽器工具,不具備互動功能。為了解決互動問題,網景公司希望能通過一種腳本語言來實現。至於使用什麽語言,網景公司一時也難以決定。這時,Sun公司推出了Java,給人的感覺就是擁抱了Java,就等於擁抱了未來。作為Java的信徒,網景公司於是選擇與Sun合作,推出JavaScript語言。
網景的本意是制作一個Java的簡化版腳本語言,但很不幸,他們請來開發JavaScript語言的設計師Brendan Eich 並不是Java的信徒,只用10天時間就將JavaScript寫出來了。不過,JavaScript並沒有成為簡化版的Java,而是成了一個大雜燴,使用了C語言的語法、Java語言的數據類型和內存管理,借鑒Scheme,把函數式開發作為主要開發方式,借鑒Self語言,使用基於原型(prototype)的繼承機制。這個大雜燴就這樣成為我們現在使用起來比較酸爽的JavaScript。以至於作為JavaScript的設計師,他自己一點都不喜歡這個作品:“與其說我愛JavaScript,不如說我恨它。它是C語言和Self語言結合的產物。十八世紀英國文學家約翰遜博士說得好:‘它的優秀之處並非原創,它的原創之處並不優秀’”。這都是和公司決策層妥協後的結果。而這造成的最終結果就是不少人誤以為JavaScript就是Java,為了修正JavaScript的開發問題,不斷衍生出不同版本的衍生語言,如CoffeeScript、TypeScript等。這件事給編者的第一觀感就是情懷這東西,太有毒了,不得不時常用來提醒自己。想當初,編者也是有情懷的,也曾自學過Java,但在使用過後,加上Sun和微軟的Java之爭,就再也不去考慮了。
網景推出了這樣一種語言,微軟等其他公司也不甘落後,都各自推出了自己的腳本語言。如果各大公司都這樣各自獨立地發展下去,那麽最頭疼的就是開發人員了,為了解決各瀏覽器的兼容性問題,那可是要費九牛二虎之力的。還好,網景做了一個好的表率,在1996年11月,將JavaScript提交給了國家標準化組織ECMA,使JavaScript成了一種國際標準,各大公司雖然有私心,但也不得不遵守標準,不然,最大的後果就是被開發人員甚至用戶拋棄。在1997年,ECMA發布262號標準文件的第一版,也就是ECMAScript 1.0。JavaScript這個名稱只是人們習慣的說法,它的正式名稱是ECMAScript,這樣做一是因為JavaScript是網景公司的商標,不便於使用,二是為了保證這門語言的開放性和中立性。
ECMAScript在1998年發布了2.0版本,在1999年發布了3.0版本,然後就戛然而止。這其中的原因是在2000年醞釀ECMAScript 4.0的時候,版本太過於激進了,導致標準委員會的一些成員不願意接受。2007年10月,ECMAScript 4.0版草案發布,但在發布正式版本前,又發生了嚴重分歧。其中,雅虎、微軟和谷歌等為首的大公司反對大幅升級,主張小幅改動,這畢竟關系到他們的利益,而以Brendan Eich為首的Mozilla則堅持當前的草案。事情鬧得不可開交,到了2008年7月,ECMA不得不中止ECMAScript 4.0的開發,將其中一部分小的功能改善發布為3.1版本,而激進的改動則留待以後解決。在2009年12月,將ECMAScript 3.1改名為ECMAScript 5.0發布。2011年6月,ECMAScript 5.1版發布,並且成為ISO國際標準(ISO/IEC 16262:2011)。
2013年3月,ECMAScript 6草案凍結,不再添加新功能。新功能設想將被放到ECMAScript 7。2013年12月,ECMAScript 6草案發布。然後是12個月的討論期,聽取各方反饋。2015年6月,ECMAScript 6正式通過,成為國際標準。從這一版本開始,ECMAScript 6更名為ECMAScript 2015,也就是以年份作為版本號,不再使用以往的版本號。之後就每年發布一個版本,直到如今的ECMAScript 2018。
綜觀JavaScript的發展,與行業的發展是密不可分的。在JavaScript誕生後,程序員就開始考慮如何利用JavaScript來構建更豐富的客戶端。例如,編者2000年在一家網絡公司工作時,為了實現項目中的日期選擇,就與同事合作編寫了日期選擇器,之後,又完成了一個顏色選擇器。不過,這項工作沒持續多長時間,編者就離開了,沒繼續從事這方面的工作。當編者重新走上Web開發的路途時,JavaScript已經從以前的單一組件化(如HTC、DXHtml等)走向了框架化。
在這裏不得不提一下微軟、谷歌和雅虎的貢獻。XML H t t p Request對象是微軟發明的,被整合到了IE 4中,不過,在當時並沒有引起什麽轟動,直到谷歌在谷歌地圖中用它實現了令人驚艷的交互效果,才引發了一場我們稱之為Web 2.0的技術革命。伴隨著Web 2.0的步伐,各種JavaScript框架以井噴的形式爆發。在這波大潮當中,雅虎的YUI可以說是第一個相當實用的圖形界面(UI)庫,可惜的是,最終用的人並不多。不過,雅虎的另一個貢獻YUI Compressor卻非常受歡迎,它本來是為YUI服務的,可將零散的YUI文件壓縮為一個單一的腳本包,而最終發展成為各種框架或腳本應用程序的壓縮打包程序,而這無疑是腳本發展的一個跨越。試想一下,對於一個大型項目或者框架來說,總不可能把腳本都寫在一個文件裏,但文件太多,對服務器負載和瀏覽器的響應來說都是難以接受的,通過壓縮和打包的方式將文件壓縮並合並到一個文件,對於服務器的負載和瀏覽器的響應就好很多了,無疑大大促進了框架的發展。
隨著移動互聯網的發展,JavaScript的應用越來越廣泛,項目逐漸擴大,為了滿足發展的需要,JavaScript不得不變,於是更新頻率越來越快。
JavaScript版本當然是越新越好,但要使用最新版本的JavaScript,就必須考慮瀏覽器的兼容性問題。如果不能兼容大多數瀏覽器,那麽部分工作就要重來,這是任何項目都難以承受的。編者在使用Ext JS開發項目的時候,排在第一位的需求是客戶對瀏覽器有什麽要求,如果一定要兼容IE 8以下的瀏覽器,編者建議不要使用Ext JS,換其他對這些瀏覽器兼容性更好的版本。當然,這在開發效率上是有所降低的,並且開發成本會上升。好在這方面要求比較高的客戶不算太多,畢竟現在還死守IE瀏覽器的用戶不是太多。編者秉持的觀點是為了這一點點的用戶而去犧牲開發效率、開發成本以及維護成本,不值得。而且用戶也不是鐵板一塊,或許他們早厭煩了IE,只是沒有機會,或者沒有動力,或者不知道怎麽去更換瀏覽器而已。在使用最新版本的ECMAScript方面就比編者使用Ext JS彈性大了,通過代碼轉換器和填充代碼等方式,可以將代碼轉換為兼容老舊瀏覽器的代碼,非常方便,還好,Ext JS這個框架也在往這個方向遷移。可以預見,未來JavaScript的開發模式基本都是使用NodeJS以及各種類庫,使用最新的ECMAScript來開發項目的。能早點熟悉這種開發模式,對於要進入這個行業的開發人員來說是必不可少的。本書最後的例子就是為大家熟悉這種開發模式而專門添加的。
本書的開發環境如下。
● 操作系統:Windows 10。
● 開發工具:Visual Studio Code。
● NodeJS:10.7.0。
● 瀏覽器:Firefox 61.0.1
……
在本書的出版過程中,得到了清華大學出版社圖格新知事業部編輯的大力支持,在他們的努力下,促成了本書的出版,在此表示衷心的感謝。此外,還要感謝那些在互聯網上默默耕耘的博客作者以及在各大論壇回復問題的大牛們,是他們的努力耕耘,才使編者找到解決問題的辦法,是他們讓編者有了進一步提高技能的機會。
PDF下載鏈接: https://pan.baidu.com/s/1wBMir_zwX09otx-LxMdsUQ 提取碼: 5c77
最新IT書籍推介