本書由資深軟件開(kāi)發(fā)專家撰寫,凝聚其多年開(kāi)發(fā)經(jīng)驗(yàn),系統(tǒng)、深入、全面地闡釋JavaScript,內(nèi)容涉及流行的Web開(kāi)發(fā)實(shí)踐,結(jié)合實(shí)際案例進(jìn)行講解,授人以漁。本書內(nèi)容并不局限于某個(gè)具體功能的使用方法,而是系統(tǒng)深入地講解JavaScript的本質(zhì)與結(jié)構(gòu),清晰闡釋ECMAScript、DOM和BOM三部分內(nèi)容的關(guān)系及重要性,以幫助開(kāi)發(fā)人員全面深入了解前端開(kāi)發(fā)技術(shù)。本書講解的內(nèi)容通俗易懂、深入淺出,特別是書中所用示例的設(shè)計(jì),它們不僅可以讓讀者理解某個(gè)知識(shí)點(diǎn)的用法,更能讓讀者明白具體知識(shí)點(diǎn)所使用的場(chǎng)景,從而更深入地理解具體內(nèi)容。 本書內(nèi)容安排合理,架構(gòu)清晰,注意理論與實(shí)踐相結(jié)合,適合那些希望學(xué)習(xí)Web編程語(yǔ)言的初、中級(jí)程序員和希望精通JavaScript的程序員閱讀。
前言
第一次接觸JavaScript時(shí)的場(chǎng)景現(xiàn)在已經(jīng)記不清了,不過(guò)因?yàn)橛衅渌Z(yǔ)言的基礎(chǔ),我很快就上手了。當(dāng)時(shí)感覺(jué)JavaScript就是一門不需要專門去學(xué)的語(yǔ)言,太簡(jiǎn)單了!
但是,隨著使用的深入,才逐漸發(fā)現(xiàn)事實(shí)并非如此。JavaScript既不像C語(yǔ)言這類面向過(guò)程的語(yǔ)言,也不像C++、Java這類面向?qū)ο蟮恼Z(yǔ)言。JavaScript中有些概念雖然在其他語(yǔ)言(這里主要指C、C++和Java)里也有,但是含義卻不盡相同,而且JavaScript中還有很多其他語(yǔ)言所沒(méi)有的用法和概念。例如,在函數(shù)體中還可以再定義另外一個(gè)函數(shù),函數(shù)也是對(duì)象,而且有個(gè)特殊的prototype屬性,另外也可以使用函數(shù)創(chuàng)建對(duì)象,以及由此引出的閉包、參數(shù)作用域鏈和琢磨不透的this指針等,后來(lái)感覺(jué)越用越不明白了。
隨著近幾年B/S結(jié)構(gòu)的快速發(fā)展,JavaScript已經(jīng)成了一門不可或缺的語(yǔ)言。GitHub在2015年8月20日發(fā)布的統(tǒng)計(jì)數(shù)據(jù)顯示,JavaScript是現(xiàn)在最受歡迎的語(yǔ)言。另一篇開(kāi)源中國(guó)社區(qū)的文章更是指出,在所有stars超過(guò)10000個(gè)的倉(cāng)庫(kù)中,基于JavaScript開(kāi)發(fā)的倉(cāng)庫(kù)占到55.7%!
既然離不開(kāi)那就將其弄明白。經(jīng)過(guò)一段時(shí)間的努力終于將其弄清楚了,而且也明白了其背后的實(shí)現(xiàn)原理。既然花費(fèi)了不少精力,那么何不讓更多的人受益,以使自己的付出更有意義呢。于是就有了大家手中的這本書。
本書的目標(biāo)是幫助讀者理解JavaScript的各種語(yǔ)法及底層的實(shí)現(xiàn)原理,進(jìn)而靈活使用其所提供的內(nèi)在對(duì)象,所以本書并不是針對(duì)零基礎(chǔ)的讀者。如果您要閱讀本書,至少需要使用過(guò)JavaScript,如果同時(shí)還使用過(guò)C/C++或者Java就更好了。
本書特點(diǎn)
系統(tǒng):全書采用了總分總的結(jié)構(gòu)。首先整體介紹了JavaScript、ECMAScript、DOM、BOM和HTML5之間的關(guān)系,然后依次對(duì)每一項(xiàng)內(nèi)容進(jìn)行講解,最后進(jìn)行總結(jié)。全書系統(tǒng)介紹了JavaScript的內(nèi)部結(jié)構(gòu);提出了將JavaScript分為兩種對(duì)象的思維方式;深入分析JavaScript中各種屬性和變量的關(guān)系;系統(tǒng)闡述DOM及其節(jié)點(diǎn)的結(jié)構(gòu);深入分析了HTML5中6種新增內(nèi)容的使用方法。
全面:全面包含整體和細(xì)節(jié)兩個(gè)方面。從整體來(lái)說(shuō),包含JavaScript基礎(chǔ)、ECMAScript2015、DOM、BOM和HTML5這5個(gè)部分,幾乎涵蓋了JavaScript的所有相關(guān)知識(shí)。細(xì)節(jié)指每一部分內(nèi)容的全面性,例如,JavaScript基礎(chǔ)里涵蓋了this指針、變量作用域、prototype繼承、閉包、對(duì)象與對(duì)象之間的關(guān)系等比較容易出錯(cuò)的內(nèi)容,ECMAScript2015(ECMAScript6)中介紹了絕大部分新增的內(nèi)容,而HTML5部分幾乎對(duì)所介紹的每種功能都講解了其所包含的全部方法和屬性。
深入:本書并不僅僅給大家介紹JavaScript中的各種語(yǔ)法,還說(shuō)明了底層的實(shí)現(xiàn)原理,以及使用中需要注意的地方。另外,對(duì)于讀者可能不熟悉的內(nèi)容(例如,數(shù)據(jù)庫(kù)、多線程等)會(huì)先介紹相關(guān)的概念,然后介紹JavaScript中的操作方法。
通俗易懂:本書盡量使用通俗易懂的文字給大家介紹相關(guān)知識(shí),避免因?yàn)橐恍⿲S忻~而給大家造成理解上的困難,對(duì)于不容易理解的地方還會(huì)通過(guò)比喻或舉例來(lái)幫助大家理解。
本書結(jié)構(gòu)
本書一共分為5篇。
第一篇整體介紹JavaScript的結(jié)構(gòu),以及與ECMAScript、DOM、BOM、HTML5的關(guān)系,另外還對(duì)ECMAScript的語(yǔ)法及背后的原理進(jìn)行了系統(tǒng)講解。
第二篇系統(tǒng)介紹ECMAScript2015中新增的內(nèi)容。
第三篇介紹DOM的結(jié)構(gòu)及其所包含的各種子標(biāo)準(zhǔn)。
第四篇介紹BOM中的4個(gè)對(duì)象。
第五篇介紹HTML5中的6種實(shí)用功能,并對(duì)全書進(jìn)行總結(jié)。
致謝
本書的整個(gè)編寫過(guò)程都離不開(kāi)父親韓志榮的支持和在背后的默默付出,這種感謝是無(wú)法言表的。另外,還要感謝清華大學(xué)出版社的秦健編輯以及他所在的團(tuán)隊(duì),如果沒(méi)有他們的支持和付出,本書也不可能跟大家順利見(jiàn)面。
寫書并不像看書那么簡(jiǎn)單,雖然筆者已經(jīng)盡力了,但是由于精力和能力的原因難免還會(huì)存在表述不準(zhǔn)確甚至不正確的地方,還請(qǐng)大家不吝批評(píng)指正。
目錄
第一篇JavaScript基礎(chǔ)知識(shí)
第1章JavaScript怎么學(xué)2
1.1三種學(xué)習(xí)方法2
1.2JavaScript的學(xué)習(xí)方法3
第2章JavaScript簡(jiǎn)介6
2.1ECMAScript概述7
2.2DOM概述8
2.3BOM概述8
2.4HTML5概述9
第3章JavaScript的本質(zhì)10
3.1工具介紹10
3.2JavaScript的結(jié)構(gòu)15
3.3JavaScript的內(nèi)存模型17
第4章function類型對(duì)象20
4.1創(chuàng)建function20
4.2用作對(duì)象23
4.3處理業(yè)務(wù)23
4.4創(chuàng)建對(duì)象49
4.5三種子類型57
第5章object類型對(duì)象62
5.1創(chuàng)建object類型對(duì)象的三種方式62
5.2對(duì)象的屬性66
5.3屬性的描述74
第6章直接量及其相關(guān)對(duì)象79
6.1直接量的保存方式79
6.2直接量的封包與解包80
6.3直接量的包裝對(duì)象81
第7章點(diǎn)運(yùn)算符與this關(guān)鍵字90
7.1點(diǎn)運(yùn)算符90
7.2this的含義90
7.3關(guān)聯(lián)方法后的this91
7.4內(nèi)部函數(shù)中的this91
7.5對(duì)象的屬性不可以繼承93
第8章Global與Window對(duì)象94
8.1Global對(duì)象94
8.2Window對(duì)象的特殊性94
第二篇ECMAScript2015中的新特性
第9章類98
9.1新類型class98
9.2class的用法98
第10章模塊100
10.1模塊的基本用法100
10.2導(dǎo)入后重命名101
10.3默認(rèn)導(dǎo)出102
10.4導(dǎo)入為命名空間103
10.5打包導(dǎo)出103
第11章新增語(yǔ)法105
11.1let和const105
11.2字符串模板106
11.3函數(shù)參數(shù)默認(rèn)值106
11.4參數(shù)擴(kuò)展107
11.5箭頭函數(shù)107
11.6for-of遍歷108
第12章新增對(duì)象111
12.1Symbol111
12.2容器對(duì)象112
12.3緩存對(duì)象121
12.4異步處理128
12.5GeneratorFunction和Generator132
12.6反射與代理134
第13章原有對(duì)象的新增屬性140
13.1Object140
13.2String143
13.3Number150
13.4Array150
13.5Math154
13.6RegExp155
第三篇DOM
第14章DOM概述162
14.1DOM標(biāo)準(zhǔn)的結(jié)構(gòu)162
14.2DOM標(biāo)準(zhǔn)的特點(diǎn)163
第15章DOM核心164
15.1文檔對(duì)象164
15.2異常對(duì)象177
15.3輔助對(duì)象178
第16章DOM中的HTML標(biāo)準(zhǔn)182
16.1HTMLCollection182
16.2HTMLOptionsCollection184
16.3HTMLDocument184
16.4HTMLElement186
第17章DOM事件187
17.1事件流187
17.2EventTarget189
17.3EventListener190
17.4Event190
17.5DOM0級(jí)事件199
第18章DOM樣式和視圖201
18.1Views201
18.2StyleSheets202
18.3CSS204
第19章DOM遍歷和范圍215
19.1遍歷215
19.2范圍219
第四篇BOM
第20章window對(duì)象228
20.1窗口、框架相關(guān)屬性228
20.2窗口操作相關(guān)屬性230
20.3彈出窗口相關(guān)屬性231
20.4瀏覽器對(duì)象相關(guān)屬性231
20.5定時(shí)器相關(guān)屬性231
20.6其他屬性234
第21章location對(duì)象235
21.18個(gè)讀寫屬性235
21.2三個(gè)方法屬性237
第22章其他對(duì)象238
22.1history對(duì)象238
22.2navigator對(duì)象238
第五篇HTML5
第23章本地存儲(chǔ)242
23.1本地存儲(chǔ)的分類242
23.2Storage存儲(chǔ)243
23.3StorageEvent245
23.4IndexedDB數(shù)據(jù)庫(kù)248
第24章canvas作圖271
24.1繪制矩形272
24.2繪制路徑274
24.3組合與剪切282
24.4坐標(biāo)檢測(cè)285
24.5修改顏色和樣式286
24.6插入文本290
24.7插入圖片292
24.8環(huán)境的保存和恢復(fù)292
24.9移動(dòng)坐標(biāo)原點(diǎn)293
24.10旋轉(zhuǎn)坐標(biāo)系294
24.11縮放295
24.12自由轉(zhuǎn)換297
24.13陰影298
24.14動(dòng)畫299
24.15游戲300
第25章WebSocket306
25.1網(wǎng)絡(luò)傳輸?shù)脑砗偷讓訁f(xié)議306
25.2WebSocket簡(jiǎn)介307
25.3WebSocket的優(yōu)勢(shì)308
25.4基本應(yīng)用308
25.5RESTful應(yīng)用312
25.6在線聊天系統(tǒng)313
25.7傳輸對(duì)象和二進(jìn)制數(shù)據(jù)318
第26章多線程處理335
26.1單線程與多線程的概念335
26.2線程與進(jìn)程的概念337
26.3JavaScript中的多線程338
第27章獲取位置信息347
27.1geolocation對(duì)象347
27.2Position接口348
27.3PositionError接口349
27.4PositionOptions接口350
27.5顯示到地圖上353
第28章富文本編輯器與公式編輯器356
28.1富文本編輯器的原理356
28.2公式編輯器364
第29章總結(jié)380
29.1ECMAScript380
29.2DOM和BOM381
29.3HTML5382
附錄ExcelibIDB源代碼384