關(guān)于我們
書(shū)單推薦
新書(shū)推薦
|
深入理解ES6
在整個(gè)JavaScript語(yǔ)言的發(fā)展歷史中,ECMAScript 6代表了最大的核心變化。最新的ECMAScript 6不僅增加了新的對(duì)象類(lèi)型,還添加了新的語(yǔ)法和令人興奮的新功能。通過(guò)多年的研究和討論,ECMAScript 6在2014年達(dá)到了功能完善的狀態(tài)。但是要讓所有的JavaScript環(huán)境都能支持ECMAScript 6還需要一段時(shí)間,因此還是有必要了解即將出現(xiàn)的以及已經(jīng)可用的功能。
√ 不識(shí)老尼,枉為前端攻城獅,其成名作《JS高級(jí)程序設(shè)計(jì)》曾名動(dòng)江湖。
√ Redux締造者與React核心成員作序力薦,盛贊本書(shū)對(duì)JS的剖析無(wú)人企及。
√ 用直截了當(dāng)?shù)姆绞絺鬟_(dá)艱深的技術(shù)細(xì)節(jié),對(duì)技術(shù)的理解方可高效送達(dá)。
√ 中高級(jí)開(kāi)發(fā)者藉由本書(shū)可一舉邁入對(duì)標(biāo)準(zhǔn)及其未來(lái)特性熟稔于心之化境。
譯者序
十年前誰(shuí)也無(wú)法料到,彼時(shí)只能寫(xiě)小動(dòng)畫(huà)的玩具語(yǔ)言JavaScript竟會(huì)有如今之威力,這愈發(fā)顯現(xiàn)出Atwood定律“凡是能用JavaScript寫(xiě)出來(lái)的應(yīng)用,最終都會(huì)用JavaScript來(lái)寫(xiě)”的正確性。追本溯源,這與ECMAScript的發(fā)展功不可沒(méi)。
然而,ECMAScript的發(fā)展并非一帆風(fēng)順。
1999年末,ECMA-262第3版[1]正式定稿,在之后的五六年中,幾乎看不到標(biāo)準(zhǔn)的任何新進(jìn)展。直到2005年左右,隨著Google在多個(gè)重交互的應(yīng)用中普及Ajax,開(kāi)發(fā)者們逐漸接受這項(xiàng)新技術(shù)并逐步恢復(fù)對(duì)JavaScript的關(guān)注。于是,JavaScript創(chuàng)始人BrendanEich緊鑼密鼓地籌劃ECMAScript4標(biāo)準(zhǔn),直到2007年,耗時(shí)兩年的ECMAScript4標(biāo)準(zhǔn)擴(kuò)充工作在JeffDyer看來(lái)已經(jīng)達(dá)到ECMAScript3的兩倍[2],Brendan遂撰文[3]進(jìn)一步澄清與解釋。
DouglasCrockford認(rèn)為這是一種過(guò)度復(fù)雜的稅負(fù)[4],并聯(lián)合微軟起草ECMAScript3.1提案,同時(shí),微軟也在TC-39會(huì)議中正式反對(duì)ES4中的部分標(biāo)準(zhǔn)。沖突過(guò)后,占據(jù)輿論優(yōu)勢(shì)的ECMAScript3.1于2009年作為ES5正式發(fā)布[5]。
ECMAScript4并未就此消亡。委員會(huì)全體成員將ECMAScript3.1與ECMAScript4中的精華保留,作為ECMAScriptHarmony(取和諧之意),它轉(zhuǎn)而成為委員會(huì)的下一個(gè)目標(biāo)ECMAScript6,并于2015年6月正式定稿,最終被命名為ECMAScript2015。委員會(huì)一改往日冗長(zhǎng)的議程,約定每年必出一版,通常以當(dāng)年年份命名。截至此書(shū)翻譯完畢,ECMAScript2016也于2016年6月正式定稿[6],最新標(biāo)準(zhǔn)尚在進(jìn)程中[7]。
《UnderstandingECMAScript6》一書(shū)是作者NicholasC.Zakas在GitHub開(kāi)源社區(qū)[8]撰寫(xiě)而成。作為標(biāo)準(zhǔn)的轉(zhuǎn)述者,存在部分理解誤區(qū)合情合理,本譯作基于NoStarchPress出版社于2016年8月出版的首印版,適當(dāng)參考GitHub中的討論集結(jié)而成。
在本書(shū)翻譯結(jié)束之際,感慨萬(wàn)千。首先感謝裕波,是他的引薦讓我有機(jī)會(huì)翻譯本書(shū)。特別感謝李松峰老師、Hax老師與克軍老師的不吝賜教,幫助我審校翻譯內(nèi)容。還要感謝博文視點(diǎn)的俠少(張春雨編輯),他高標(biāo)準(zhǔn)、嚴(yán)要求的專(zhuān)業(yè)態(tài)度時(shí)刻鞭策我前行。
感謝就職于騰訊的時(shí)光,帶我入行的導(dǎo)師張坤、為我解答所有疑惑的Leader陳恕勝、共同學(xué)習(xí)成長(zhǎng)的兄弟陳煒鑫及其他伙伴,你們一絲不茍的態(tài)度不斷磨練我的心性。
最后,特別要感謝我的母親楊虹女士,每當(dāng)我不堪于兼顧工作與翻譯的時(shí)候,總是您的鼓勵(lì)點(diǎn)亮我前進(jìn)的道路。
在本書(shū)的翻譯過(guò)程中我力求還原作者本意,但限于時(shí)間與水平,翻譯不當(dāng)之處在所難免,還敬請(qǐng)各位讀者不吝賜教,我也會(huì)及時(shí)與出版社同步以備再版時(shí)進(jìn)行修正,或以勘誤的形式公布。如您有任何想法與建議,歡迎寫(xiě)信至我的郵箱:lenville@gmail.com。
[1]https://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,3rdedition,December1999.pdf
[2]https://mail.mozilla.org/pipermail/es-discuss/2007-October/001442.html
[3]https://brendaneich.com/2007/11/es4-news-and-opinion/
[4]https://mail.mozilla.org/pipermail/es-discuss/2008-March/002529.html
[5]http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-2625theditionDecember2009.pdf
[6]https://www.ecma-international.org/ecma-262/7.0/index.html
[7]https://tc39.github.io/ecma262/
[8]https://github.com/nzakas/understandinges6
序
ECMAScript6如暴風(fēng)雨般驟臨世界,人們期待已久而它卻突然出現(xiàn),傳播之快始料未及。每個(gè)人都與ECMAScript6有著一段不同的故事,以下是我的故事。
2013年,我還在一家創(chuàng)業(yè)公司工作,正在從iOS轉(zhuǎn)向Web研發(fā),之后我參加了JavaScript開(kāi)源社區(qū)并共同創(chuàng)建了Redux。當(dāng)時(shí)我正在努力學(xué)習(xí)Web開(kāi)發(fā),而且我非常害怕,我的團(tuán)隊(duì)必須在短短幾個(gè)月的時(shí)間內(nèi)將我們的產(chǎn)品用JavaScript重構(gòu)為Web版。
起初我認(rèn)為用JavaScript編寫(xiě)大型軟件的想法很可笑,但是一名團(tuán)隊(duì)成員說(shuō)服了我,他說(shuō)JavaScript不是一門(mén)玩具語(yǔ)言。我同意撇開(kāi)成見(jiàn)試一試,于是打開(kāi)MDN和StackOverflow首次深入學(xué)習(xí)JavaScript。我對(duì)這門(mén)簡(jiǎn)約的語(yǔ)言著了迷,我的同事還教我如何使用工具,例如代碼整理工具(linter)和代碼合并工具(bundler)[譯者注:代碼壓縮工具(minifier)對(duì)于生產(chǎn)力和性能來(lái)說(shuō)也至關(guān)重要。]。在這幾個(gè)星期里我恍然大悟,原來(lái)我如此喜歡編寫(xiě)JavaScript代碼。
但沒(méi)有一門(mén)語(yǔ)言是完美的,由于使用過(guò)其他語(yǔ)言,我非常希望JavaScript也可以頻繁更新,但在這10年間,ECMAScript5是唯一的重大更新,它只實(shí)現(xiàn)了一小部分特性,完全支持瀏覽器需要數(shù)10年的時(shí)間。彼時(shí),即將到來(lái)的代號(hào)為Harmony的ECMAScript6(ES6)規(guī)范尚未完成,遙遙無(wú)期!耙苍S在10年內(nèi)我能夠?qū)懸恍〦CMAScript6代碼吧!蔽蚁。
一些實(shí)驗(yàn)性的“轉(zhuǎn)譯器(Transpiler)”,如谷歌的Traceur,可以將代碼從ECMAScript6轉(zhuǎn)換成ECMAScript5。它們大多功能非常有限,或難以插入現(xiàn)有的JavaScript構(gòu)建管道。但是,隨后出現(xiàn)的新型轉(zhuǎn)譯器6to5改變了一切。它易于安裝,可以很好地集成在現(xiàn)有的工具中,生成的代碼可讀,于是其像野火般蔓延開(kāi)來(lái)。6to5現(xiàn)在被稱(chēng)作Babel,在標(biāo)準(zhǔn)定稿前就開(kāi)始為主流受眾提供ECMAScript6的特性。幾個(gè)月以來(lái),ECMAScript6無(wú)處不在。
出于各種原因,ECMAScript6已經(jīng)把社區(qū)割裂開(kāi)來(lái)。正如本書(shū)所講,在許多主流瀏覽器中ECMAScript6仍未完全實(shí)現(xiàn)。當(dāng)你學(xué)習(xí)這門(mén)語(yǔ)言時(shí),不得不進(jìn)行的構(gòu)建步驟足以使人退縮。一些庫(kù)的文檔和示例中有ECMAScript6的代碼,你可能想知道這些庫(kù)是否可以在ECMAScript5環(huán)境中使用。這令人感到困惑,由于這門(mén)語(yǔ)言之前幾乎從未改變過(guò),因此許多人對(duì)于新特性的加入并沒(méi)有十分期待,而有一部分人在焦急地等待新功能的到來(lái),并希望所有的這些新功能能放在一起使用—在某些情況下,甚至為了使用而使用,不管是否必要。
正當(dāng)我對(duì)JavaScript的使用逐漸熟練時(shí),我感覺(jué)再往前走很困難,我不得不學(xué)習(xí)一門(mén)新的語(yǔ)言。那幾個(gè)月的時(shí)間里我感到很糟糕。最后在圣誕節(jié)前夕,我開(kāi)始閱讀本書(shū)的草稿,我簡(jiǎn)直愛(ài)不釋手,在凌晨3點(diǎn),當(dāng)參加聚會(huì)的每一位成員都已熟睡,而我卻理解了ECMAScript6!
Nicholas是一位非常有天賦的老師。他以直截了當(dāng)?shù)姆绞絺鬟_(dá)深刻的細(xì)節(jié),讓你能夠理解所有這些知識(shí)。除了本書(shū)之外,他也因創(chuàng)建ESLint而出名,這是一個(gè)被下載了數(shù)百萬(wàn)次的JavaScript代碼分析器。
Nicholas對(duì)JavaScript的了解程度很少有人能夠企及,所以不要錯(cuò)過(guò)吸取新知識(shí)的機(jī)會(huì)。閱讀本書(shū),你將對(duì)掌握ECMAScript6充滿(mǎn)信心。
DanAbramov
React核心團(tuán)隊(duì)成員及Redux的創(chuàng)造者
前言
JavaScript核心的語(yǔ)言特性是在標(biāo)準(zhǔn)ECMA-262中被定義的。該標(biāo)準(zhǔn)中定義的語(yǔ)言被稱(chēng)作ECMAScript,它是JavaScript的子集。在瀏覽器與Node.js環(huán)境中通過(guò)附加的對(duì)象和方法可添加更多新功能,而JavaScript的核心依然保持ECMAScript的定義。總的來(lái)說(shuō),ECMA-262標(biāo)準(zhǔn)的持續(xù)發(fā)展對(duì)于JavaScript的成功功不可沒(méi)。ECMAScript6是JavaScript最新的重大更新,本書(shū)將為你講解其中的改動(dòng)。
ECMAScript6之路
2007年,JavaScript走向了發(fā)展中的轉(zhuǎn)折點(diǎn),逐漸興起的Ajax開(kāi)創(chuàng)了動(dòng)態(tài)Web應(yīng)用的新時(shí)代,而自1999年第三版ECMA-262發(fā)布以來(lái),JavaScript卻沒(méi)有絲毫改變。當(dāng)時(shí),負(fù)責(zé)推動(dòng)ECMAScript語(yǔ)言發(fā)展的TC-39委員會(huì)將大量規(guī)范草案整合在了ECMAScript4中,新增的語(yǔ)言特性涉足甚廣,包括:模塊、類(lèi)、類(lèi)繼承、私有對(duì)象成員、可選類(lèi)型注釋及眾多其他的特性。
然而,TC-39組織內(nèi)部對(duì)ECMAScript4的動(dòng)議草案產(chǎn)生了巨大分歧,部分成員認(rèn)為不應(yīng)該一次性在第四版標(biāo)準(zhǔn)中加入過(guò)多的新功能,而來(lái)自雅虎、谷歌和微軟的技術(shù)負(fù)責(zé)人則共同商討并提交了一份“ECMAScript3.1”草案作為下一代ECMAScript的可選方案,此處的“3.1”意在表明只是對(duì)現(xiàn)有標(biāo)準(zhǔn)進(jìn)行小幅的增量修改。
ECMAScript3.1引入的語(yǔ)法變化極少,這一版標(biāo)準(zhǔn)相對(duì)而言更專(zhuān)注于優(yōu)化屬性特性,支持原生JSON,以及為已有對(duì)象增添新的方法。委員會(huì)曾經(jīng)嘗試融合ECMAScript3.1與ECMAScript4,但由于對(duì)峙雙方對(duì)語(yǔ)言未來(lái)的發(fā)展方向分歧過(guò)大,最后以失敗告終。
到了2008年,JavaScript創(chuàng)始人BrendanEich宣布TC-39委員會(huì)將合力推進(jìn)ECMAScript3.1的標(biāo)準(zhǔn)化工作。他們選擇將ECMAScript4中提出的大部分針對(duì)語(yǔ)法及特性的改動(dòng)暫時(shí)擱置,到下一個(gè)版本ECMAScript的標(biāo)準(zhǔn)化工作完成之后,委員會(huì)全體成員再努力融合ECMAScript3.1和4中的精華,他們還給這個(gè)版本起了一個(gè)昵稱(chēng)—ECMAScriptHarmony(取和諧之意)。
經(jīng)過(guò)標(biāo)準(zhǔn)化的ECMAScript3.1最終作為ECMA-262第五版正式發(fā)布,它同時(shí)也被稱(chēng)為ECMAScript5。委員會(huì)表示他們永不發(fā)布第四版,以避免與從未面世的“ECMAScript4”產(chǎn)生命名沖突。基于ECMAScriptHarmony的工作隨后陸續(xù)展開(kāi),繼承了精華的ECMAScript6將成為繼ECMAScript5之后發(fā)布的首個(gè)新標(biāo)準(zhǔn)。
ECMAScript6標(biāo)準(zhǔn)的特性已于2015年全部完成,并被正式命名為“ECMAScript2015”(由于開(kāi)發(fā)者們對(duì)ECMAScript6更為熟悉,因此本書(shū)將繼續(xù)沿用此稱(chēng)謂)。新標(biāo)準(zhǔn)的變化俯拾即是,大到全新的對(duì)象和模式、大幅的語(yǔ)法改動(dòng),小到為已有對(duì)象擴(kuò)充新的方法。更令人激動(dòng)的是,ECMAScript6中點(diǎn)滴的變化全都致力于解決開(kāi)發(fā)者實(shí)際工作中遇到的問(wèn)題。
關(guān)于本書(shū)
深入理解ECMAScript6的特性對(duì)于所有JavaScript開(kāi)發(fā)人員來(lái)說(shuō)至關(guān)重要,在可預(yù)見(jiàn)的未來(lái),ECMAScript6中引入的語(yǔ)言特性將構(gòu)成構(gòu)建JavaScript應(yīng)用程序的基礎(chǔ)。這也是本書(shū)的初衷,筆者希望你通過(guò)閱讀本書(shū)來(lái)了解ECMAScript6的新特性,并在需要時(shí)隨時(shí)能夠予以使用。
瀏覽器與Node.js中的兼容性
開(kāi)發(fā)者們正積極地為Web瀏覽器及Node.js這些JavaScript的宿主環(huán)境添加ECMAScript6的新功能。本書(shū)只關(guān)注規(guī)范中定義的正確行為,不會(huì)對(duì)比每種實(shí)現(xiàn)間的差異。如此一來(lái),讀者所使用的JavaScript環(huán)境有可能與本書(shū)中描述的不一致。
本書(shū)的目標(biāo)讀者
本書(shū)是專(zhuān)門(mén)為熟悉JavaScript和ECMAScript5的讀者準(zhǔn)備的指南,幫助大家理解ECMAScript5和6之間的差異。對(duì)ECMAScript6早已熟稔于心的讀者不必繼續(xù)閱讀下去。本書(shū)特別適合想了解語(yǔ)言未來(lái)特性的JavaScript中高級(jí)開(kāi)發(fā)者,無(wú)論你的工作環(huán)境是Node.js還是Web瀏覽器,本書(shū)都非常適合你。
本書(shū)不適合從未寫(xiě)過(guò)JavaScript代碼的初學(xué)者,讀者們需要對(duì)這門(mén)語(yǔ)言的基礎(chǔ)知識(shí)有一定的理解,這樣才能發(fā)揮本書(shū)的最大效用。
本書(shū)概覽
本書(shū)中的每一個(gè)章節(jié)與附錄都涵蓋有ECMAScript6的不同方面,許多章節(jié)一開(kāi)始都會(huì)討論ECMAScript6中新變化的來(lái)龍去脈,以及這些改動(dòng)試圖解決的問(wèn)題。所有章節(jié)都包含代碼示例來(lái)幫助你學(xué)習(xí)新的語(yǔ)法及概念。
第1章塊級(jí)作用域綁定討論var在塊級(jí)作用域中的替代方案—let和const。
第2章字符串和正則表達(dá)式詳盡介紹字符串模板,以及新增的操作與檢查字符串的功能。
第3章函數(shù)討論函數(shù)的多處改動(dòng),包括箭頭函數(shù)(ArrowFunction)、默認(rèn)參數(shù)(DefaultParameters)、不定參數(shù)(RestParameters)等。
第4章擴(kuò)展對(duì)象的功能性解讀對(duì)象創(chuàng)建、修改及使用方面的改動(dòng),包括對(duì)象字面量語(yǔ)法的變化、新的反射方法等。
第5章解構(gòu):使數(shù)據(jù)訪(fǎng)問(wèn)更便捷介紹一種通過(guò)簡(jiǎn)明的語(yǔ)法分解對(duì)象和數(shù)組的方法—對(duì)象和數(shù)組解構(gòu)。
第6章Symbol和Symbol屬性介紹定義屬性的新途徑—Symbol。Symbol是一種新的原始類(lèi)型,可用于創(chuàng)建外部無(wú)法直接訪(fǎng)問(wèn)的對(duì)象屬性和方法。
第7章Set集合與Map集合詳述四種新的集合類(lèi)型:Set、WeakSet、Map及WeakMap。這些類(lèi)型為數(shù)組增添了新的語(yǔ)義、去重機(jī)制,以及專(zhuān)門(mén)為JavaScript設(shè)計(jì)的內(nèi)存管理機(jī)制,極大地?cái)U(kuò)展了數(shù)組的實(shí)用性。
第8章迭代器(Iterator)和生成器(Generator)這兩個(gè)全新的功能可以協(xié)助你更有效地處理集合數(shù)據(jù),在早期版本的JavaScript中無(wú)法實(shí)現(xiàn)這樣的功能。
第9章JavaScript中的類(lèi)介紹JavaScript中首次正式加入的類(lèi)概念。接觸過(guò)其他語(yǔ)言的開(kāi)發(fā)者通常會(huì)對(duì)JavaScript的語(yǔ)法感到困惑,新增的類(lèi)語(yǔ)法使JavaScript變得更易上手,而且對(duì)熱衷于JavaScript的開(kāi)發(fā)者來(lái)說(shuō)新的語(yǔ)法變得更加簡(jiǎn)潔。
第10章改進(jìn)數(shù)組的功能詳述針對(duì)原生數(shù)組進(jìn)行的改動(dòng),以及這些有趣的變化為開(kāi)發(fā)者所帶來(lái)的新體驗(yàn)。
第11章Promise與異步編程介紹語(yǔ)言的新成員—Promise。它是草根群體不斷努力的結(jié)晶,由于各大JavaScript庫(kù)的鼎立支持,這一功能逐漸被廣大開(kāi)發(fā)者所接受。ECMAScript6正式將Promise納入標(biāo)準(zhǔn)并為其提供可用的Polyfill。
第12章代理(Proxy)和反射(Reflection)API介紹正式加入JavaScript的反射API和新的代理對(duì)象,開(kāi)發(fā)者可以通過(guò)代理對(duì)象攔截每一個(gè)在對(duì)象中執(zhí)行的操作,代理也賦予了開(kāi)發(fā)者空前的對(duì)象控制權(quán),同樣也為定義新的交互模式帶來(lái)無(wú)限可能。
第13章用模塊封裝代碼詳述JavaScript的官方模塊風(fēng)格。加入這一定義旨在代替過(guò)去幾年中出現(xiàn)過(guò)的許多非正式的模塊定義風(fēng)格。
附錄AECMAScript6中較小的改動(dòng)涵蓋了ECMAScript6中實(shí)現(xiàn)的其他改動(dòng),它們與每一章所涉及的主題關(guān)系不大,一般很少使用這些功能。
附錄B了解ECMAScript7(2016)描述了在ECMAScript7中實(shí)現(xiàn)的三個(gè)附加功能,它們?cè)诮诘挠绊懥Σ粫?huì)像ECMAScript6一樣大。
排版約定
本書(shū)使用以下的排版約定:
等寬字體代碼塊表示較長(zhǎng)的代碼示例,如下所示:
functiondoSomething(){
//empty
}
在代碼塊中,console.log()語(yǔ)句右側(cè)的注釋表示在瀏覽器或Node.js控制臺(tái)中顯示的代碼執(zhí)行結(jié)果,例如:
console.log("Hi");//"Hi"
如果代碼塊中的某行代碼引發(fā)錯(cuò)誤,也會(huì)在代碼的右側(cè)指示:
doSomething();//拋出錯(cuò)誤
幫助與支持
如果你在閱讀本書(shū)時(shí)有任何疑問(wèn),請(qǐng)發(fā)送郵件至我的郵件列表,地址為http://groups.google.com/group/zakasbooks。
Nicholas C. Zakas自2000年以來(lái)一直致力于Web應(yīng)用程序的開(kāi)發(fā),重點(diǎn)關(guān)注前端開(kāi)發(fā),并以寫(xiě)作和講述前沿佳實(shí)踐而聞名。他曾于雅虎主頁(yè)任職5年有余,他也是多本書(shū)的作者,其中包括The Principles of Object-Oriented JavaScript(No Starch Press出版社)和Professional JavaScript for Web Developers(Wrox出版社)。
關(guān)于技術(shù)評(píng)審
Juriy Zaytsev(在網(wǎng)上以kangax著稱(chēng))是紐約的一位前端網(wǎng)站開(kāi)發(fā)人員。自2007年以來(lái),他一直在探索JavaScript的怪異特性并撰寫(xiě)相關(guān)文章。Juriy為多個(gè)開(kāi)源項(xiàng)目做出過(guò)貢獻(xiàn),其中包括Prototype.js和其他的熱門(mén)項(xiàng)目,如他自己的Fabric.js。他是按需定制打印服務(wù)printio.ru的共同創(chuàng)始人,目前任職于Facebook。
第1章 塊級(jí)作用域綁定 1
var聲明及變量提升(Hoisting)機(jī)制 1
塊級(jí)聲明 3
-- let聲明 3
-- 禁止重聲明 4
-- const聲明 4
-- 臨時(shí)死區(qū)(Temporal Dead Zone) 6
循環(huán)中的塊作用域綁定 7
-- 循環(huán)中的函數(shù) 8
-- 循環(huán)中的let聲明 9
-- 循環(huán)中的const聲明 10
全局塊作用域綁定 12
塊級(jí)綁定最佳實(shí)踐的進(jìn)化 13
小結(jié) 13
第2章 字符串和正則表達(dá)式 14
更好的Unicode支持 14
-- UTF-16碼位 15
-- codePointAt()方法 16
-- String.fromCodePoint()方法 17
-- normalize()方法 17
-- 正則表達(dá)式u修飾符 19
其他字符串變更 21
-- 字符串中的子串識(shí)別 21
-- repeat()方法 22
其他正則表達(dá)式語(yǔ)法變更 23
-- 正則表達(dá)式y(tǒng)修飾符 23
-- 正則表達(dá)式的復(fù)制 26
-- flags屬性 27
模板字面量 28
-- 基礎(chǔ)語(yǔ)法 28
-- 多行字符串 29
-- 字符串占位符 31
-- 標(biāo)簽?zāi)0?32
小結(jié) 36
第3章 函數(shù) 37
函數(shù)形參的默認(rèn)值 37
-- 在ECMAScript 5中模擬默認(rèn)參數(shù) 38
-- ECMAScript 6中的默認(rèn)參數(shù)值 38
-- 默認(rèn)參數(shù)值對(duì)arguments對(duì)象的影響 40
-- 默認(rèn)參數(shù)表達(dá)式 42
-- 默認(rèn)參數(shù)的臨時(shí)死區(qū) 44
處理無(wú)命名參數(shù) 46
-- ECMAScript 5中的無(wú)命名參數(shù) 46
-- 不定參數(shù) 47
增強(qiáng)的Function構(gòu)造函數(shù) 49
展開(kāi)運(yùn)算符 50
name屬性 52
-- 如何選擇合適的名稱(chēng) 52
-- name屬性的特殊情況 52
明確函數(shù)的多重用途 54
-- 在ECMAScript 5中判斷函數(shù)被調(diào)用的方法 54
-- 元屬性(Metaproperty)new.target 55
塊級(jí)函數(shù) 57
-- 塊級(jí)函數(shù)的使用場(chǎng)景 58
-- 非嚴(yán)格模式下的塊級(jí)函數(shù) 58
箭頭函數(shù) 59
-- 箭頭函數(shù)語(yǔ)法 60
-- 創(chuàng)建立即執(zhí)行函數(shù)表達(dá)式 62
-- 箭頭函數(shù)沒(méi)有this綁定 63
-- 箭頭函數(shù)和數(shù)組 65
-- 箭頭函數(shù)沒(méi)有arguments綁定 66
-- 箭頭函數(shù)的辨識(shí)方法 66
尾調(diào)用優(yōu)化 67
-- ECMAScript 6中的尾調(diào)用優(yōu)化 68
-- 如何利用尾調(diào)用優(yōu)化 69
小結(jié) 71
第4章 擴(kuò)展對(duì)象的功能性 72
對(duì)象類(lèi)別 72
對(duì)象字面量語(yǔ)法擴(kuò)展 73
-- 屬性初始值的簡(jiǎn)寫(xiě) 73
-- 對(duì)象方法的簡(jiǎn)寫(xiě)語(yǔ)法 74
-- 可計(jì)算屬性名(Computed Property Name) 75
新增方法 76
-- Object.is()方法 76
-- Object.assign()方法 77
重復(fù)的對(duì)象字面量屬性 80
自有屬性枚舉順序 81
增強(qiáng)對(duì)象原型 82
-- 改變對(duì)象的原型 82
-- 簡(jiǎn)化原型訪(fǎng)問(wèn)的Super引用 83
正式的方法定義 86
小結(jié) 88
第5章 解構(gòu):使數(shù)據(jù)訪(fǎng)問(wèn)更便捷 89
為何使用解構(gòu)功能 89
對(duì)象解構(gòu) 90
-- 解構(gòu)賦值 91
-- 默認(rèn)值 92
-- 為非同名局部變量賦值 93
-- 嵌套對(duì)象解構(gòu) 94
數(shù)組解構(gòu) 96
-- 解構(gòu)賦值 97
-- 默認(rèn)值 99
-- 嵌套數(shù)組解構(gòu) 99
-- 不定元素 99
混合解構(gòu) 101
解構(gòu)參數(shù) 102
-- 必須傳值的解構(gòu)參數(shù) 103
-- 解構(gòu)參數(shù)的默認(rèn)值 104
小結(jié) 106
第6章 Symbol和Symbol屬性 107
創(chuàng)建Symbol 107
Symbol的使用方法 109
Symbol共享體系 110
Symbol與類(lèi)型強(qiáng)制轉(zhuǎn)換 112
Symbol屬性檢索 112
通過(guò)well-known Symbol暴露內(nèi)部操作 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
小結(jié) 127
第7章 Set集合與Map集合 128
ECMAScript 5中的Set集合與Map集合 129
該解決方案的一些問(wèn)題 129
ECMAScript 6中的Set集合 131
-- 創(chuàng)建Set集合并添加元素 131
-- 移除元素 133
-- Set集合的forEach()方法 133
-- 將Set集合轉(zhuǎn)換為數(shù)組 136
-- Weak Set集合 136
ECMAScript 6中的Map集合 139
-- Map集合支持的方法 140
-- Map集合的初始化方法 141
-- Map集合的forEach()方法 142
-- Weak Map集合 143
小結(jié) 147
第8章 迭代器(Iterator)和生成器(Generator) 149
循環(huán)語(yǔ)句的問(wèn)題 149
什么是迭代器 150
什么是生成器 151
-- 生成器函數(shù)表達(dá)式 153
-- 生成器對(duì)象的方法 154
可迭代對(duì)象和for-of循環(huán) 155
-- 訪(fǎng)問(wèn)默認(rèn)迭代器 156
-- 創(chuàng)建可迭代對(duì)象 157
內(nèi)建迭代器 158
-- 集合對(duì)象迭代器 158
-- 字符串迭代器 163
-- NodeList迭代器 164
展開(kāi)運(yùn)算符與非數(shù)組可迭代對(duì)象 165
高級(jí)迭代器功能 166
-- 給迭代器傳遞參數(shù) 166
-- 在迭代器中拋出錯(cuò)誤 168
-- 生成器返回語(yǔ)句 170
-- 委托生成器 171
異步任務(wù)執(zhí)行 174
-- 簡(jiǎn)單任務(wù)執(zhí)行器 174
-- 向任務(wù)執(zhí)行器傳遞數(shù)據(jù) 176
-- 異步任務(wù)執(zhí)行器 177
小結(jié) 180
第9章 JavaScript中的類(lèi) 181
ECMAScript 5中的近類(lèi)結(jié)構(gòu) 181
類(lèi)的聲明 182
-- 基本的類(lèi)聲明語(yǔ)法 182
-- 為何使用類(lèi)語(yǔ)法 184
類(lèi)表達(dá)式 186
-- 基本的類(lèi)表達(dá)式語(yǔ)法 186
-- 命名類(lèi)表達(dá)式 187
作為一等公民的類(lèi) 189
訪(fǎng)問(wèn)器屬性 190
可計(jì)算成員名稱(chēng) 192
生成器方法 193
靜態(tài)成員 195
繼承與派生類(lèi) 196
-- 類(lèi)方法遮蔽 199
-- 靜態(tài)成員繼承 199
-- 派生自表達(dá)式的類(lèi) 200
-- 內(nèi)建對(duì)象的繼承 203
-- Symbol.species屬性 205
在類(lèi)的構(gòu)造函數(shù)中使用new.target 208
小結(jié) 210
第10章 改進(jìn)的數(shù)組功能 211
創(chuàng)建數(shù)組 211
-- Array.of()方法 212
-- Array.from()方法 213
為所有數(shù)組添加的新方法 216
-- find()方法和findIndex()方法 217
-- fill()方法 217
-- copyWithin()方法 218
定型數(shù)組 219
-- 數(shù)值數(shù)據(jù)類(lèi)型 220
-- 數(shù)組緩沖區(qū) 221
-- 通過(guò)視圖操作數(shù)組緩沖區(qū) 221
定型數(shù)組與普通數(shù)組的相似之處 228
-- 通用方法 229
-- 相同的迭代器 230
-- of()方法和from()方法 230
定型數(shù)組與普通數(shù)組的差別 231
-- 行為差異 231
-- 缺失的方法 232
-- 附加方法 233
小結(jié) 234
第11章 Promise與異步編程 235
異步編程的背景知識(shí) 235
-- 事件模型 236
-- 回調(diào)模式 236
Promise的基礎(chǔ)知識(shí) 239
-- Promise的生命周期 239
-- 創(chuàng)建未完成的Promise 242
-- 創(chuàng)建已處理的Promise 244
-- 執(zhí)行器錯(cuò)誤 247
全局的Promise拒絕處理 248
Node.js環(huán)境的拒絕處理 248
瀏覽器環(huán)境的拒絕處理 251
串聯(lián)Promise 253
-- 捕獲錯(cuò)誤 254
-- Promise鏈的返回值 255
-- 在Promise鏈中返回Promise 256
響應(yīng)多個(gè)Promise 259
-- Promise.all()方法 259
-- Promise.race()方法 260
自Promise繼承 262
基于Promise的異步任務(wù)執(zhí)行 263
小結(jié) 267
第12章 代理(Proxy)和反射(Reflection)API 269
數(shù)組問(wèn)題 269
代理和反射 270
創(chuàng)建一個(gè)簡(jiǎn)單的代理 271
使用set陷阱驗(yàn)證屬性 272
用get陷阱驗(yàn)證對(duì)象結(jié)構(gòu)(Object Shape) 274
使用has陷阱隱藏已有屬性 275
用deleteProperty陷阱防止刪除屬性 277
原型代理陷阱 279
-- 原型代理陷阱的運(yùn)行機(jī)制 279
-- 為什么有兩組方法 281
對(duì)象可擴(kuò)展性陷阱 282
-- 兩個(gè)基礎(chǔ)示例 283
-- 重復(fù)的可擴(kuò)展性方法 284
屬性描述符陷阱 285
-- 給Object.defineProperty()添加限制 286
-- 描述符對(duì)象限制 287
-- 重復(fù)的描述符方法 288
ownKeys陷阱 290
函數(shù)代理中的apply和construct陷阱 291
-- 驗(yàn)證函數(shù)參數(shù) 292
-- 不用new調(diào)用構(gòu)造函數(shù) 294
-- 覆寫(xiě)抽象基類(lèi)構(gòu)造函數(shù) 296
-- 可調(diào)用的類(lèi)構(gòu)造函數(shù) 297
可撤銷(xiāo)代理 298
解決數(shù)組問(wèn)題 299
-- 檢測(cè)數(shù)組索引 300
-- 添加新元素時(shí)增加length的值 300
-- 減少length的值來(lái)刪除元素 302
-- 實(shí)現(xiàn)MyArray類(lèi) 304
將代理用作原型 307
-- 在原型上使用get陷阱 307
-- 在原型上使用set陷阱 308
-- 在原型上使用has陷阱 309
-- 將代理用作類(lèi)的原型 310
小結(jié) 314
第13章 用模塊封裝代碼 315
什么是模塊 315
導(dǎo)出的基本語(yǔ)法 316
導(dǎo)入的基本語(yǔ)法 317
-- 導(dǎo)入單個(gè)綁定 318
-- 導(dǎo)入多個(gè)綁定 318
-- 導(dǎo)入整個(gè)模塊 318
-- 導(dǎo)入綁定的一個(gè)微妙怪異之處 320
導(dǎo)出和導(dǎo)入時(shí)重命名 320
模塊的默認(rèn)值 321
-- 導(dǎo)出默認(rèn)值 321
-- 導(dǎo)入默認(rèn)值 322
重新導(dǎo)出一個(gè)綁定 323
無(wú)綁定導(dǎo)入 324
加載模塊 325
-- 在Web瀏覽器中使用模塊 325
-- 瀏覽器模塊說(shuō)明符解析 329
小結(jié) 330
附錄A ECMAScript 6中較小的改動(dòng) 331
附錄B 了解ECMAScript 7(2016) 337
索引 343
你還可能感興趣
我要評(píng)論
|