關(guān)于我們
書單推薦
新書推薦
|
JavaScript編程精解(原書第3版) 讀者對(duì)象:程序設(shè)計(jì)人員、以及相關(guān)讀者
本書第3版深入研究JavaScript語言,詳細(xì)介紹如何編寫漂亮、高效的代碼。更新的內(nèi)容包括:類表示法、箭頭函數(shù)、迭代器、異步函數(shù)、模板字符串和塊作用域等功能的全新內(nèi)容。 本書通過大量示例進(jìn)行講解,并提供大量習(xí)題和完整項(xiàng)目案例,為讀者提供了編寫自己的程序的實(shí)踐經(jīng)驗(yàn)。書中不僅介紹JavaScript語言的基本結(jié)構(gòu)以及控制結(jié)構(gòu)、函數(shù)和數(shù)據(jù)結(jié)構(gòu),還詳細(xì)介紹錯(cuò)誤處理和錯(cuò)誤修復(fù)、模塊化和異步編程,以及Web瀏覽器編程。
本書從JavaScript的基本語言特性入手,提綱挈領(lǐng)地介紹JavaScript的主要功能和特色,包括基本結(jié)構(gòu)、函數(shù)、數(shù)據(jù)結(jié)構(gòu)、高階函數(shù)、錯(cuò)誤處理、正則表達(dá)式、模塊、異步編程、瀏覽器文檔對(duì)象模型、事件處理、繪圖、HTTP表單、Node等,可以幫助你循序漸進(jìn)地掌握基本的編程概念、技術(shù)和思想。而且書中提供5個(gè)項(xiàng)目實(shí)戰(zhàn)章節(jié),涉及路徑查找、自制編程語言、平臺(tái)交互游戲、繪圖工具和動(dòng)態(tài)網(wǎng)站,可以幫助你快速上手實(shí)際的項(xiàng)目。此外,本書還介紹了JavaScript性能優(yōu)化的方法論、思路和工具,以幫助我們開發(fā)高效的程序。
本書第3版包含了JavaScript語言ES6規(guī)范的新功能,如綁定、常量、類、promise等。通過本書的學(xué)習(xí),你將了解JavaScript語言的新發(fā)展,編寫出更強(qiáng)大的代碼。 本書的在線網(wǎng)站提供了所有源代碼,你可以通過在線沙箱來編輯、運(yùn)行代碼,并實(shí)時(shí)查看輸出結(jié)果。
【前言】
本書講述如何指揮計(jì)算機(jī)開展工作。如今計(jì)算機(jī)與螺絲刀一樣普遍,但它們比螺絲刀復(fù)雜得多,讓它們完成你想做的工作并不容易。 如果是一個(gè)常見的、易于理解的任務(wù),例如顯示你的電子郵件或充當(dāng)計(jì)算器,你可以打開相應(yīng)的應(yīng)用程序并開始工作。但對(duì)于獨(dú)一無二或開放式的任務(wù),可能沒有現(xiàn)成的應(yīng)用程序可用。 這就是編程的用武之地。編程是構(gòu)建程序的行為,而程序是一組告訴計(jì)算機(jī)該做什么的精確指令。因?yàn)橛?jì)算機(jī)是頭腦簡(jiǎn)單、死板的,編程基本上是單調(diào)乏味和令人沮喪的。 幸運(yùn)的是,如果你能克服這些,甚至可能享受愚笨的機(jī)器可以處理的嚴(yán)謹(jǐn)思維,那么編程可以帶來豐厚的回報(bào)。它允許你在幾秒鐘內(nèi)完成手工永遠(yuǎn)無法完成的操作。這是一種讓你的計(jì)算機(jī)工具做以前無法做的事情的方法。它提供了抽象思維的精彩練習(xí)。 大多數(shù)編程活動(dòng)都是用編程語言完成的。編程語言是用于指導(dǎo)計(jì)算機(jī)的人造語言。有趣的是,我們發(fā)現(xiàn)與計(jì)算機(jī)通信的最有效方式是從人類彼此通信的方式中借鑒大量的內(nèi)容。與人類語言一樣,計(jì)算機(jī)語言允許以新的方式組合單詞和短語,從而可以表達(dá)新的概念。 基于語言的界面,例如20世紀(jì)80年代和90年代的BASIC和DOS提示符,在某種程度上曾經(jīng)是與計(jì)算機(jī)交互的主要方法。它們?cè)诤艽蟪潭壬媳粓D形界面取代,圖形界面更容易學(xué)習(xí),但提供的自由度更低。如果你知道計(jì)算機(jī)語言的藏身之處,就仍然可以把它們用起來。每種現(xiàn)代Web瀏覽器都內(nèi)置了一種這樣的語言——JavaScript,因此它幾乎可以在每臺(tái)設(shè)備上使用。 本書將努力讓你熟悉這種語言,以便用它來做有用和有趣的事情。 【關(guān)于編程】 除了解釋JavaScript之外,我還將介紹編程的基本原理。事實(shí)證明,編程很難。基本規(guī)則簡(jiǎn)單明了,但基于這些規(guī)則構(gòu)建的程序往往變得非常復(fù)雜,從而無法說明其規(guī)則和復(fù)雜性。編程在某種程度上構(gòu)建了自己的迷宮,你可能會(huì)迷失在里面。 有時(shí)讀這本書會(huì)讓人非常沮喪。如果你不熟悉編程,那么會(huì)有很多新內(nèi)容需要消化。其次,大部分時(shí)候都需要你具備其他相關(guān)知識(shí)才能理解這些內(nèi)容的組合。 你需要付出必要的努力。當(dāng)你努力學(xué)習(xí)這本書時(shí),不要對(duì)自己的能力有任何懷疑。你很優(yōu)秀——只需要堅(jiān)持下去。休息一下,重讀一些章節(jié),并確保閱讀并理解示例程序和練習(xí)。學(xué)習(xí)是一項(xiàng)艱苦的工作,但你學(xué)到的一切都屬于自己,并且會(huì)使后續(xù)的學(xué)習(xí)變得更容易。 當(dāng)行動(dòng)變得無利可圖時(shí),收集信息; 當(dāng)信息變得無利可圖時(shí),睡覺。 —Ursula K. Le Guin,《黑暗的左手》 程序這個(gè)詞有多重含義。它是由程序員鍵入的一段文本,是使計(jì)算機(jī)完成任務(wù)的指揮力量,它也是計(jì)算機(jī)內(nèi)存中的數(shù)據(jù),它還控制在同一內(nèi)存上執(zhí)行的操作。將程序與我們熟悉的對(duì)象進(jìn)行類比往往不盡如人意。有一種表面上比較恰當(dāng)?shù)谋扔,即把程序視作包含許多零件的機(jī)器,為了使整臺(tái)機(jī)器正常運(yùn)轉(zhuǎn),我們必須考慮如何將這些零件相互連接起來,并實(shí)現(xiàn)整體的運(yùn)轉(zhuǎn)。 計(jì)算機(jī)是一臺(tái)承載這些無形機(jī)器的物理機(jī)器。計(jì)算機(jī)本身只能做簡(jiǎn)單直接的事情。它們?nèi)绱擞杏玫脑蚴撬鼈冏鲞@些事情的速度極快。程序可以巧妙地結(jié)合大量簡(jiǎn)單的動(dòng)作來完成非常復(fù)雜的事情。 程序是思想的結(jié)晶。構(gòu)造它不需要成本,它也沒有重量,通過打字我們很容易把它創(chuàng)造出來。 但是,如果不加注意,程序的大小和復(fù)雜性將會(huì)失去控制,甚至?xí)箻?gòu)造它的人無法理解。保持程序受控是編程中需要考慮的主要問題。當(dāng)一個(gè)程序正常工作時(shí),它是優(yōu)美的。編程藝術(shù)是控制復(fù)雜性的技能。出色的程序都是簡(jiǎn)明的,它們的復(fù)雜性都不太高。 一些程序員認(rèn)為管理這種復(fù)雜性的最好辦法是只在程序中使用一小部分易于理解的技術(shù)。他們制定了嚴(yán)格的規(guī)則(“最佳實(shí)踐”)來規(guī)定程序應(yīng)該具有的形式,并小心地把它們限定在很小的安全范圍內(nèi)。 這不僅無聊,而且效果不佳。新問題通常需要新的解決方案。編程的歷史不長(zhǎng),并且仍在迅速發(fā)展,而且它的變化足以為不同的方法提供空間。在程序設(shè)計(jì)中有很多可怕的錯(cuò)誤,應(yīng)該繼續(xù)大膽犯錯(cuò)以加深你的理解。編寫好程序的感覺是在編程實(shí)踐中培養(yǎng)起來的,而不是從一系列規(guī)則中學(xué)到的。 為什么語言很重要 在計(jì)算機(jī)誕生之初,沒有編程語言。程序看起來像是這樣的: 這是一個(gè)將數(shù)字從1到10加在一起并打印出結(jié)果的程序:1 + 2 + … + 10 = 55。它可以運(yùn)行在一臺(tái)簡(jiǎn)單的虛擬機(jī)器上。要對(duì)早期的計(jì)算機(jī)進(jìn)行編程,必須在正確的位置設(shè)置大型開關(guān)陣列,或者在紙帶上打孔并將它們送入計(jì)算機(jī)。你可以想象編寫這種程序是多么乏味和容易出錯(cuò)。即使編寫簡(jiǎn)單的程序也需要很多聰明才智和規(guī)則。編寫復(fù)雜的程序幾乎是不可思議的。 當(dāng)然,手動(dòng)輸入這些神秘的二進(jìn)制位(1和0)模式確實(shí)給程序員一種強(qiáng)烈的成就感,仿佛自己成了魔法師。在工作滿意度方面,這一定非常令人滿足。 先前程序的每一行都包含一條指令。它可以用如下中文表達(dá): (1)將數(shù)字0存儲(chǔ)在內(nèi)存位置0中。 (2)將數(shù)字1存儲(chǔ)在內(nèi)存位置1中。 (3)將內(nèi)存位置1的值存儲(chǔ)在內(nèi)存位置2中。 (4)從內(nèi)存位置2的值中減去數(shù)字11。 (5)如果內(nèi)存位置2的值為數(shù)字0,則繼續(xù)執(zhí)行指令9。 (6)將內(nèi)存位置1的值添加到內(nèi)存位置0。 (7)將數(shù)字1添加到內(nèi)存位置1的值中。 (8)繼續(xù)執(zhí)行指令3。 (9)輸出內(nèi)存位置0的值。 雖然這已經(jīng)比一堆二進(jìn)制位的可讀性更好,但它仍然相當(dāng)難懂。用名稱代替數(shù)字來指代指令和內(nèi)存位置會(huì)有所改善。 你能看出這個(gè)程序是如何運(yùn)作的嗎?前兩行為兩個(gè)內(nèi)存位置提供了它們的起始值:total將用于構(gòu)建計(jì)算結(jié)果,count將跟蹤我們當(dāng)前正在查看的數(shù)字。使用compare的行可能是最奇怪的。此程序想要查看count是否等于11來決定它是否可以停止運(yùn)行。因?yàn)槲覀兊奶摂M機(jī)器相當(dāng)原始,它只能測(cè)試一個(gè)數(shù)字是否為零并據(jù)此做出決定。因此,它使用標(biāo)記為compare的內(nèi)存位置來計(jì)算count - 11的值,并根據(jù)此值來做決策。接下來的兩行將count的值添加到結(jié)果中,并且每當(dāng)程序確定count不是11時(shí),把count增加1。 下面是JavaScript中的相同程序: 這個(gè)版本為我們提供了一些改進(jìn)。最重要的是,沒有必要再次指定程序來回跳轉(zhuǎn)的方式。while結(jié)構(gòu)負(fù)責(zé)這一點(diǎn)。只要它給出的條件成立,它將繼續(xù)執(zhí)行它下面的代碼塊(用括號(hào)括起來的部分)。條件是count <= 10,這意味著“count小于或等于10”。我們不再需要?jiǎng)?chuàng)建臨時(shí)值并將其與零進(jìn)行比較,這只是一個(gè)無趣的細(xì)節(jié)。編程語言的部分功能就在于可以為我們處理無趣的細(xì)節(jié)。 在程序結(jié)束處,在while結(jié)構(gòu)完成之后,console.log操作用于寫出結(jié)果。 最后,如果我們正好有方便的range和sum操作可用,可以分別創(chuàng)建一個(gè)范圍內(nèi)的數(shù)字集合并計(jì)算數(shù)字集合的總和,例如下面的這個(gè)程序: 這個(gè)故事的寓意是,同一個(gè)程序的表達(dá)方式可長(zhǎng)可短,可讀性有好有壞。程序的第一個(gè)版本非;逎y懂,而最后一個(gè)版本幾乎是一句直白的話:記錄(log)從1到10的數(shù)字范圍(range)內(nèi)的總和(sum)。(我們將在后面的章節(jié)中看到如何定義像sum和range這樣的操作。) 一種好的編程語言可以幫助程序員討論計(jì)算機(jī)必須在更高級(jí)別執(zhí)行的操作。它有助于省略細(xì)節(jié),提供方便的構(gòu)件(例如while和console.log),允許你定義自己的構(gòu)件(例如sum和range),并使這些構(gòu)件易于組合。 【什么是JavaScript】 JavaScript于1995年面世,它是在Netscape Navigator瀏覽器中向網(wǎng)頁(yè)添加程序的一種方式。所有其他主要的圖形Web瀏覽器都已采用了此語言。它使現(xiàn)代Web應(yīng)用程序成為可能——你可以直接與這種應(yīng)用程序交互,而不必為每個(gè)動(dòng)作重新加載頁(yè)面。JavaScript也用于更傳統(tǒng)的網(wǎng)站,以提供各種形式的交互性和智能。 值得注意的是,JavaScript與名為Java的編程語言幾乎無關(guān)。采用相似名稱是出自營(yíng)銷考慮,而不是合理的判斷。當(dāng)JavaScript出現(xiàn)時(shí),Java語言正在大規(guī)模推廣并且越來越受歡迎。有人認(rèn)為嘗試搭乘這一成功語言的順風(fēng)車是一個(gè)好主意,F(xiàn)在我們已經(jīng)無法擺脫這個(gè)名字了。 JavaScript語言在Netscape之外得到采用之后,人們編寫了一個(gè)標(biāo)準(zhǔn)文檔來描述它的工作方式,以便聲稱支持JavaScript的各種軟件實(shí)際上都在討論同一種語言。這被稱為ECMAScript標(biāo)準(zhǔn),得名于標(biāo)準(zhǔn)化它的ECMA國(guó)際組織。在實(shí)踐中,ECMAScript和JavaScript這兩個(gè)術(shù)語可以互換使用,它們是同一種語言的兩個(gè)名稱。 有人會(huì)說JavaScript有許多糟糕之處。其中很多都是確實(shí)存在的。當(dāng)我第一次被要求用JavaScript編寫程序時(shí),我很快就開始鄙視它了。它幾乎可以接受我輸入的任何代碼,但它解釋這個(gè)代碼的方式卻與我的原意完全不同。這與我當(dāng)時(shí)沒有弄清楚“我在做什么”有很大關(guān)系,但這里有一個(gè)真正的問題:JavaScript在它允許的內(nèi)容上過于自由。這種設(shè)計(jì)背后的初衷是,它將使初學(xué)者更容易使用JavaScript進(jìn)行編程。實(shí)際上,因?yàn)橄到y(tǒng)不會(huì)向你指出問題,所以更難以在程序中發(fā)現(xiàn)問題。 不過,這種靈活性也有其優(yōu)點(diǎn)。它為許多技術(shù)留下了空間,這些技術(shù)在更嚴(yán)格的語言中是不可能實(shí)現(xiàn)的,正如你將看到的(例如在第10章中),它的靈活性可以用來克服一些JavaScript的缺點(diǎn)。在正確學(xué)習(xí)JavaScript語言并花一段時(shí)間使用它后,我真的變得喜歡它了。 JavaScript有好幾個(gè)版本。ECMAScript第3版是JavaScript在2000年到2010年逐漸占據(jù)主導(dǎo)地位時(shí)得到廣泛支持的版本。在此期間,ECMA正在雄心勃勃地開發(fā)第4版,此版本計(jì)劃對(duì)該語言進(jìn)行一些徹底的改進(jìn)和擴(kuò)展。以這種激進(jìn)的方式改變一種活生生的、廣泛使用的語言,在現(xiàn)實(shí)中非常困難,所以ECMA在2008年放棄開發(fā)第4版,這導(dǎo)致改動(dòng)遠(yuǎn)不那么激進(jìn)的第5版。第5版于2009年發(fā)布,只進(jìn)行了一些無爭(zhēng)議的改進(jìn)。然后在2015年發(fā)布了第6版,這是一個(gè)重大更新,其中包括原計(jì)劃加到第4版中的一些想法。從那時(shí)起,我們每年都有新的小更新。 語言不斷發(fā)展這一事實(shí)意味著瀏覽器必須不斷跟進(jìn),如果你使用的是較舊的瀏覽器,則可能無法支持所有功能。語言設(shè)計(jì)人員謹(jǐn)慎地不做任何可能破壞現(xiàn)有程序的更改,因此新瀏覽器仍然可以運(yùn)行舊程序。在本書中,我使用的是2017版JavaScript。 Web瀏覽器不是唯一使用JavaScript的平臺(tái)。一些數(shù)據(jù)庫(kù)(如MongoDB和CouchDB)也使用JavaScript作為腳本和查詢語言。用于桌面和服務(wù)器編程的幾個(gè)平臺(tái)為在瀏覽器之外編寫JavaScript提供了環(huán)境,其中最值得注意的是Node.js項(xiàng)目(詳見第20章)。 代碼以及對(duì)它的處理方式 代碼是組成程序的文本。本書中的大多數(shù)章節(jié)都包含很多代碼。我相信閱讀代碼和編寫代碼是學(xué)習(xí)編程不可或缺的部分。不要只是粗略瀏覽一下這些例子,務(wù)必仔細(xì)閱讀并理解它們。這么做起初可能很慢而且費(fèi)腦子,但我保證你會(huì)很快掌握它。習(xí)題也是如此。在你真正編寫出有效的解決方案之前,不要認(rèn)為已經(jīng)明白了它們。 我建議你嘗試使用實(shí)際的JavaScript解釋器來檢查習(xí)題答案。利用這種方式,你可以立即獲得你的代碼是否有效的反饋,并且,我希望你會(huì)嘗試進(jìn)行實(shí)驗(yàn),并且不只限于這些習(xí)題。 運(yùn)行本書中的示例代碼并進(jìn)行實(shí)驗(yàn)的最簡(jiǎn)單方法是在https://eloquentjavascript.net上的本書在線版本中查找。在那里,你可以單擊任何代碼示例來編輯和運(yùn)行它,并查看它產(chǎn)生的輸出。要進(jìn)行練習(xí),請(qǐng)?jiān)L問https://eloquentjavascript.net/code,它為每個(gè)編碼習(xí)題都提供啟動(dòng)代碼,并允許你查看解決方案。 如果你想在本書的網(wǎng)站之外運(yùn)行書中定義的程序,則需要注意一些事項(xiàng)。許多示例都獨(dú)立存在,應(yīng)該適用于任何JavaScript環(huán)境。但是后面章節(jié)中的代碼通常是針對(duì)特定環(huán)境(瀏覽器或Node.js)編寫的,并且只能在那種環(huán)境中運(yùn)行。此外,許多章節(jié)定義了規(guī)模更大的程序,出現(xiàn)在它們中的代碼片段彼此依賴或依賴于外部文件。網(wǎng)站上的沙盒提供了Zip文件的鏈接,其中包含運(yùn)行給定章節(jié)代碼所需的所有腳本和數(shù)據(jù)文件。 【本書概述】 本書包含三個(gè)部分。前十二章討論了JavaScript語言。接下來的七章介紹Web瀏覽器以及JavaScript用于瀏覽器編程的方式。最后,用兩章專門介紹Node.js,這是另一種用于編寫JavaScript的環(huán)境。 在整本書中,有五個(gè)項(xiàng)目實(shí)戰(zhàn)章節(jié),它們描述了大型的示例程序,讓你體驗(yàn)實(shí)際的編程。按照出現(xiàn)順序,我們將建立一個(gè)投遞機(jī)器人、一種編程語言、一個(gè)平臺(tái)游戲、一個(gè)像素繪圖程序和一個(gè)動(dòng)態(tài)網(wǎng)站。 本書語言部分的前四章介紹JavaScript語言的基本結(jié)構(gòu)。它們引入了控制結(jié)構(gòu)(如while)、函數(shù)(編寫自己的構(gòu)件)和數(shù)據(jù)結(jié)構(gòu)。在這之后,你將能夠編寫基本的程序。接下來,第5章和第6章介紹了使用函數(shù)和對(duì)象技術(shù)編寫更抽象的代碼并控制復(fù)雜性。 在第一個(gè)項(xiàng)目實(shí)戰(zhàn)章節(jié)之后,本書的語言部分繼續(xù)介紹錯(cuò)誤處理和錯(cuò)誤修復(fù)、正則表達(dá)式(用于處理文本的重要工具)、模塊化(針對(duì)復(fù)雜性的另一種防御)和異步編程(處理花時(shí)間的事件)等內(nèi)容。第二個(gè)項(xiàng)目實(shí)戰(zhàn)章節(jié)總結(jié)了本書的第一部分。 第二部分為第13~19章,描述了瀏覽器JavaScript可以訪問的工具。你將學(xué)會(huì)在屏幕上顯示內(nèi)容(第14章和第17章)、回應(yīng)用戶輸入(第15章),以及通過網(wǎng)絡(luò)進(jìn)行通信(第18章)。本部分也包括兩個(gè)項(xiàng)目實(shí)戰(zhàn)章節(jié)。 第三部分為第20~22章。第20章描述了Node.js,第21章使用此工具構(gòu)建了一個(gè)小型網(wǎng)站。最后,第22章描述了在優(yōu)化JavaScript程序以提高速度時(shí)需要注意的一些事項(xiàng)。 【譯者序】 JavaScript在網(wǎng)絡(luò)時(shí)代誕生,從為靜態(tài)網(wǎng)頁(yè)添加各種炫目的特效,到現(xiàn)在幾乎所有在線的交互網(wǎng)站和小程序,都大量使用了JavaScript。我們幾乎每天都通過瀏覽器和各種應(yīng)用與它打交道,它已成為我們?nèi)粘9ぷ、生活不可或缺的組成部分。它的這種無所不在,也便于我們?cè)诟鞣N環(huán)境中進(jìn)行學(xué)習(xí)。 JavaScript的演進(jìn)適應(yīng)了網(wǎng)絡(luò)的發(fā)展,標(biāo)準(zhǔn)化組織定期為它添加新功能,并且得益于大量的投資和引擎開發(fā)人員的努力,它的執(zhí)行性能也在不斷地提高。使用JavaScript不但可以編寫在瀏覽器上執(zhí)行的客戶端程序,而且可以編寫在網(wǎng)站后臺(tái)作為服務(wù)器執(zhí)行的程序。人們已利用JavaScript編寫了許多流行的工具框架,如jQuery、Angular、Express等。由它定義的JSON是輕量級(jí)的文本數(shù)據(jù)交換格式,許多數(shù)據(jù)庫(kù)軟件也支持JavaScript和JSON,如MongoDB、CouchDB、MySQL等。JavaScript已經(jīng)成為當(dāng)下最流行的“全!遍_發(fā)語言。 JavaScript內(nèi)容龐大,一本書不可能面面俱到地介紹所有內(nèi)容。本書提綱挈領(lǐng)地介紹了語言的主要功能和特色,包括基本結(jié)構(gòu)、函數(shù)、數(shù)據(jù)結(jié)構(gòu)、高階函數(shù)、錯(cuò)誤處理、正則表達(dá)式、模塊、異步編程、瀏覽器文檔對(duì)象模型、事件處理、繪圖、HTTP表單、Node等,讀者可以通過學(xué)習(xí)這些內(nèi)容循序漸進(jìn)地掌握基本的編程概念、技術(shù)和思想。為了讀者能夠較快地上手實(shí)際的項(xiàng)目,本書安排了5個(gè)實(shí)戰(zhàn)章節(jié),涉及路徑查找、自制編程語言、平臺(tái)交互游戲、繪圖工具和動(dòng)態(tài)網(wǎng)站等方面,這些章節(jié)教會(huì)我們?nèi)绾卫谜莆盏闹R(shí)實(shí)現(xiàn)各種功能,并組成一個(gè)完整的項(xiàng)目。最后一章介紹了JavaScript性能優(yōu)化的方法論、思路和工具,以幫助我們開發(fā)高效的程序。 本書與時(shí)俱進(jìn),已更新到第3版,這一版包含了JavaScript語言ES6 規(guī)范的最新功能,比如綁定、常量、類、promise等。學(xué)習(xí)了本書,就能了解該語言的最新發(fā)展,編寫出更強(qiáng)大的代碼。 本書有一個(gè)功能豐富的支持網(wǎng)站(網(wǎng)址請(qǐng)見“前言”介紹),上面有可免費(fèi)閱讀的章節(jié),可以實(shí)際執(zhí)行內(nèi)嵌的代碼段,允許即時(shí)查看結(jié)果,還有供執(zhí)行示例程序和習(xí)題的沙盒。這些都是作者精心設(shè)計(jì)的,網(wǎng)站本身就是對(duì)JavaScript的絕好展示。我的兒子盧令一就被第16章的熔巖游戲所吸引,當(dāng)他了解到這樣有趣的游戲只要幾百行代碼就能編寫出來時(shí),對(duì)編程也產(chǎn)生了濃厚的興趣。 感謝華章公司劉鋒編輯的信任,把這本書交給我翻譯。感謝我的同事們,在工作中教給我許多IT知識(shí)。感謝我的家人,他們的辛勤勞動(dòng),使我能專心地投入本書的翻譯。 盧 濤 2019年11月
馬爾奇·哈弗貝克(Marijn Haverbeke)
全球知名JavaScript程序員,通曉多種編程語言,在Web開發(fā)方面積累了豐富的經(jīng)驗(yàn),在JavaScript領(lǐng)域頗有影響力。 他研究過各種軟件系統(tǒng),從數(shù)據(jù)庫(kù)到編譯器再到編輯器均有涉及。此外,他創(chuàng)建并維護(hù)著多個(gè)流行的開源項(xiàng)目,如CodeMirror編輯器和Tern類型推導(dǎo)引擎等。
【第一部分】 語言
●第1章 值、類型和運(yùn)算符 2 1.1 值 2 1.2 數(shù)字 3 1.3 字符串 4 1.4 一元運(yùn)算符 6 1.5 布爾值 6 1.5.1 比較 6 1.5.2 邏輯運(yùn)算符 7 1.6 空值 8 1.7 自動(dòng)類型轉(zhuǎn)換 8 1.8 小結(jié) 10 ●第2章 程序結(jié)構(gòu) 11 2.1 表達(dá)式和語句 11 2.2 綁定 12 2.3 綁定名稱 13 2.4 環(huán)境 13 2.5 函數(shù) 14 2.6 console.log函數(shù) 14 2.7 返回值 15 2.8 控制流 15 2.9 條件執(zhí)行 15 2.10 while和do循環(huán) 17 2.11 縮進(jìn)代碼 18 2.12 for循環(huán) 19 2.13 跳出循環(huán) 19 2.14 簡(jiǎn)潔地更新綁定 20 2.15 使用switch調(diào)度值 20 2.16 首字母大寫 21 2.17 注釋 22 2.18 小結(jié) 22 2.19 習(xí)題 22 ●第3章 函數(shù) 24 3.1 定義一個(gè)函數(shù) 24 3.2 綁定和作用域 25 3.3 作為值的函數(shù) 27 3.4 聲明表示法 27 3.5 箭頭函數(shù) 28 3.6 調(diào)用棧 28 3.7 可選參數(shù) 29 3.8 閉包 30 3.9 遞歸 31 3.10 函數(shù)的增長(zhǎng)方式 34 3.11 函數(shù)和副作用 36 3.12 小結(jié) 36 3.13 習(xí)題 37 ●第4章 數(shù)據(jù)結(jié)構(gòu):對(duì)象和數(shù)組 38 4.1 松鼠人 38 4.2 數(shù)據(jù)集 39 4.3 屬性 39 4.4 方法 40 4.5 對(duì)象 41 4.6 可變性 43 4.7 松鼠人的日志 44 4.8 計(jì)算相關(guān)性 45 4.9 數(shù)組循環(huán) 46 4.10 最終分析 47 4.11 其他數(shù)組方法 48 4.12 字符串及其屬性 50 4.13 剩余參數(shù) 51 4.14 Math對(duì)象 52 4.15 解構(gòu) 53 4.16 JSON 54 4.17 小結(jié) 54 4.18 習(xí)題 55 ●第5章 高階函數(shù) 57 5.1 抽象化 58 5.2 提取重復(fù)的內(nèi)容 58 5.3 高階函數(shù) 59 5.4 語言字符集數(shù)據(jù)集 60 5.5 過濾數(shù)組 61 5.6 用map轉(zhuǎn)換 62 5.7 用reduce匯總 62 5.8 組合性 63 5.9 字符串和字符代碼 64 5.10 文本識(shí)別 66 5.11 小結(jié) 67 5.12 習(xí)題 67 ●第6章 對(duì)象的秘密 69 6.1 封裝 69 6.2 方法 70 6.3 原型 71 6.4 類 72 6.5 類表示法 73 6.6 覆蓋派生屬性 74 6.7 映射 75 6.8 多態(tài)性 76 6.9 符號(hào) 76 6.10 迭代器接口 78 6.11 讀取器、設(shè)置器和靜態(tài) 79 6.12 繼承 81 6.13 instanceof運(yùn)算符 82 6.14 小結(jié) 82 6.15 習(xí)題 83 ●第7章 項(xiàng)目:機(jī)器人 85 7.1 村莊Meadowf?ield 85 7.2 任務(wù) 86 7.3 持久化數(shù)據(jù) 88 7.4 模擬 89 7.5 郵車的路線 90 7.6 尋找路線 91 7.7 習(xí)題 92 ●第8章 缺陷和錯(cuò)誤 94 8.1 語言 94 8.2 嚴(yán)格模式 95 8.3 類型 96 8.4 測(cè)試 96 8.5 調(diào)試 97 8.6 錯(cuò)誤傳播 98 8.7 異常 99 8.8 異常后清理 100 8.9 選擇性捕獲 102 8.10 斷言 103 8.11 小結(jié) 104 8.12 習(xí)題 104 ●第9章 正則表達(dá)式 106 9.1 創(chuàng)建正則表達(dá)式 106 9.2 匹配測(cè)試 107 9.3 字符集 107 9.4 模式的重復(fù)部分 108 9.5 對(duì)子表達(dá)式分組 109 9.6 匹配和組 109 9.7 Date類 110 9.8 單詞和字符串邊界 111 9.9 選擇模式 112 9.10 匹配機(jī)制 112 9.11 回溯 113 9.12 replace方法 114 9.13 貪心 116 9.14 動(dòng)態(tài)創(chuàng)建RegExp對(duì)象 117 9.15 search方法 117 9.16 lastIndex屬性 118 9.17 解析INI文件 119 9.18 國(guó)際字符 121 9.19 小結(jié) 122 9.20 習(xí)題 123 ●第10章 模塊 124 10.1 模塊作為構(gòu)件 124 10.2 包 125 10.3 簡(jiǎn)易模塊 126 10.4 將數(shù)據(jù)作為代碼執(zhí)行 127 10.5 CommonJS 127 10.6 ECMAScript模塊 129 10.7 構(gòu)建和捆綁 130 10.8 模塊設(shè)計(jì) 131 10.9 小結(jié) 132 10.10 習(xí)題 133 ●第11章 異步編程 134 11.1 異步 134 11.2 烏鴉技術(shù) 135 11.3 回調(diào) 136 11.4 promise 138 11.5 失敗 139 11.6 構(gòu)建網(wǎng)絡(luò)很困難 140 11.7 promise集合 142 11.8 網(wǎng)絡(luò)泛洪 142 11.9 消息路由 143 11.10 異步函數(shù) 145 11.11 生成器 147 11.12 事件循環(huán) 148 11.13 異步bug 149 11.14 小結(jié) 150 11.15 習(xí)題 150 ●第12章 項(xiàng)目:編程語言 152 12.1 解析 152 12.2 求解器 156 12.3 特殊形式 157 12.4 環(huán)境 158 12.5 函數(shù) 159 12.6 編譯 160 12.7 作弊 161 12.8 習(xí)題 161 【第二部分】 瀏覽器 ●第13章 瀏覽器中的JavaScript 164 13.1 網(wǎng)絡(luò)和互聯(lián)網(wǎng) 164 13.2 Web 165 13.3 HTML 166 13.4 HTML和JavaScript 168 13.5 沙盒 168 13.6 兼容性和瀏覽器大戰(zhàn) 169 ●第14章 文檔對(duì)象模型 170 14.1 文檔結(jié)構(gòu) 170 14.2 樹 171 14.3 標(biāo)準(zhǔn) 172 14.4 通過樹結(jié)構(gòu) 173 14.5 尋找元素 174 14.6 更改文檔 175 14.7 創(chuàng)建節(jié)點(diǎn) 175 14.8 屬性 177 14.9 布局 177 14.10 樣式 179 14.11 層疊樣式 180 14.12 查詢選擇器 181 14.13 定位和動(dòng)畫 182 14.14 小結(jié) 184 14.15 習(xí)題 184 ●第15章 處理事件 186 15.1 事件處理程序 186 15.2 事件和DOM節(jié)點(diǎn) 187 15.3 事件對(duì)象 188 15.4 傳播 188 15.5 默認(rèn)操作 189 15.6 按鍵事件 190 15.7 指針事件 191 15.8 滾動(dòng)事件 194 15.9 焦點(diǎn)事件 195 15.10 加載事件 196 15.11 事件和事件循環(huán) 196 15.12 計(jì)時(shí)器 197 15.13 限頻 198 15.14 小結(jié) 199 15.15 習(xí)題 199 ●第16章 項(xiàng)目:平臺(tái)游戲 201 16.1 游戲 201 16.2 技術(shù) 202 16.3 關(guān)卡 202 16.4 讀取關(guān)卡 203 16.5 演員 204 16.6 封裝是一種負(fù)擔(dān) 207 16.7 繪圖 207 16.8 動(dòng)作和碰撞 211 16.9 演員的更新 214 16.10 跟蹤按鍵 215 16.11 運(yùn)行游戲 216 16.12 習(xí)題 218 ●第17章 在畫布上繪圖 219 17.1 SVG 219 17.2 畫布元素 220 17.3 線和面 221 17.4 路徑 222 17.5 曲線 223 17.6 繪制餅圖 225 17.7 文本 226 17.8 圖片 227 17.9 轉(zhuǎn)換 228 17.10 存儲(chǔ)和清除轉(zhuǎn)換 230 17.11 回到游戲 231 17.12 選擇圖形界面 236 17.13 小結(jié) 236 17.14 習(xí)題 237 ●第18章 HTTP和表單 239 18.1 協(xié)議 239 18.2 瀏覽器和HTTP 241 18.3 fetch 242 18.4 HTTP沙盒 243 18.5 欣賞HTTP 243 18.6 安全性和HTTPS 244 18.7 表單域 244 18.8 焦點(diǎn) 246 18.9 禁用域 247 18.10 表單整體 247 18.11 文本域 248 18.12 復(fù)選框和單選按鈕 249 18.13 選擇域 250 18.14 文件域 251 18.15 在客戶端存儲(chǔ)數(shù)據(jù) 252 18.16 小結(jié) 254 18.17 習(xí)題 255 ●第19章 項(xiàng)目:像素繪圖程序 257 19.1 組件 257 19.2 狀態(tài) 259 19.3 DOM的建立 260 19.4 畫布 261 19.5 應(yīng)用程序 263 19.6 繪圖工具 264 19.7 保存和加載 267 19.8 撤銷歷史記錄 269 19.9 讓我們畫吧 270 19.10 為什么這么難 271 19.11 習(xí)題 271 【第三部分】 Node ●第20章 Node.js 276 20.1 背景 276 20.2 node命令 277 20.3 模塊 277 20.4 使用NPM安裝 278 20.5 文件系統(tǒng)模塊 280 20.6 HTTP模塊 281 20.7 流 283 20.8 文件服務(wù)器 284 20.9 小結(jié) 288 20.10 習(xí)題 289 ●第21章 項(xiàng)目:技能分享網(wǎng)站 290 21.1 設(shè)計(jì) 290 21.2 長(zhǎng)輪詢 291 21.3 HTTP接口 292 21.4 服務(wù)器 293 21.5 客戶端 299 21.6 習(xí)題 304 ●第22章 JavaScript性能 305 22.1 分階段編譯 305 22.2 圖的布局 306 22.3 定義圖 307 22.4 力導(dǎo)向布局 308 22.5 避免工作 310 22.6 分析器 312 22.7 函數(shù)內(nèi)聯(lián) 313 22.8 減少垃圾 314 22.9 垃圾收集 314 22.10 動(dòng)態(tài)類型 315 22.11 小結(jié) 316 22.12 習(xí)題 317 附錄 部分習(xí)題解答提示 318
你還可能感興趣
我要評(píng)論
|