深入理解ES6

深入理解ES6 pdf epub mobi txt 電子書 下載 2025

[美] Nicholas,C.,Zakas 著,劉振濤 校
圖書標籤:
  • JavaScript
  • ES6
  • ECMAScript
  • 前端開發
  • 編程
  • 技術
  • Web開發
  • 現代JavaScript
  • 阮一峰
  • 學習
想要找書就要到 靜流書站
立刻按 ctrl+D收藏本頁
你會得到大驚喜!!
齣版社: 電子工業齣版社
ISBN:9787121317989
版次:1
商品編碼:12213616
品牌:Broadview
包裝:平裝
開本:16開
齣版時間:2017-07-01
用紙:膠版紙
頁數:396

具體描述

編輯推薦

  √ 不識老尼,枉為前端攻城獅,其成名作《JS高級程序設計》曾名動江湖。

  √ Redux締造者與React核心成員作序力薦,盛贊本書對JS的剖析無人企及。

  √ 用直截瞭當的方式傳達艱深的技術細節,對技術的理解方可高效送達。

  √ 中高級開發者藉由本書可一舉邁入對標準及其未來特性熟稔於心之化境。


內容簡介

ES6是ECMAScript標準十餘年來變動大的一個版本,其中添加瞭許多新的語法特性,既有大傢耳熟能詳的Promise,也有聞所未聞的Proxy代理和Reflection反射;既有可以通過轉譯器(Transpiler)等方式在舊版本瀏覽器中實現兼容的let、const、不定參數、展開運算符等功能,亦有無論如何都無法實現嚮前兼容的尾調用優化。深入理解ES6的特性對於所有JavaScript開發者而言至關重要,在可預見的未來,ES6中引入的語言特性會成為JavaScript應用程序的主流特性,這也是《深入理解ES6》的初衷。希望你通過閱讀《深入理解ES6》可以瞭解ES6的新特性,並在需要時能夠隨時使用。

作者簡介

Nicholas C. Zakas自2000年以來一直緻力於Web應用程序的開發,重點關注前端開發,並以寫作和講述前沿佳實踐而聞名。他曾於雅虎主頁任職5年有餘,他也是多本書的作者,其中包括The Principles of Object-Oriented JavaScript(No Starch Press齣版社)和Professional JavaScript for Web Developers(Wrox齣版社)。

關於技術評審

Juriy Zaytsev(在網上以kangax著稱)是紐約的一位前端網站開發人員。自2007年以來,他一直在探索JavaScript的怪異特性並撰寫相關文章。Juriy為多個開源項目做齣過貢獻,其中包括Prototype.js和其他的熱門項目,如他自己的Fabric.js。他是按需定製打印服務printio.ru的共同創始人,目前任職於Facebook。

目錄

第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

前言/序言

  譯者序

  十年前誰也無法料到,彼時隻能寫小動畫的玩具語言JavaScript竟會有如今之威力,這愈發顯現齣Atwood定律“凡是能用JavaScript寫齣來的應用,最終都會用JavaScript來寫”的正確性。追本溯源,這與ECMAScript的發展功不可沒。

  然而,ECMAScript的發展並非一帆風順。

  1999年末,ECMA-262第3版[1]正式定稿,在之後的五六年中,幾乎看不到標準的任何新進展。直到2005年左右,隨著Google在多個重交互的應用中普及Ajax,開發者們逐漸接受這項新技術並逐步恢復對JavaScript的關注。於是,JavaScript創始人BrendanEich緊鑼密鼓地籌劃ECMAScript4標準,直到2007年,耗時兩年的ECMAScript4標準擴充工作在JeffDyer看來已經達到ECMAScript3的兩倍[2],Brendan遂撰文[3]進一步澄清與解釋。

  DouglasCrockford認為這是一種過度復雜的稅負[4],並聯閤微軟起草ECMAScript3.1提案,同時,微軟也在TC-39會議中正式反對ES4中的部分標準。衝突過後,占據輿論優勢的ECMAScript3.1於2009年作為ES5正式發布[5]。

  ECMAScript4並未就此消亡。委員會全體成員將ECMAScript3.1與ECMAScript4中的精華保留,作為ECMAScriptHarmony(取和諧之意),它轉而成為委員會的下一個目標ECMAScript6,並於2015年6月正式定稿,最終被命名為ECMAScript2015。委員會一改往日冗長的議程,約定每年必齣一版,通常以當年年份命名。截至此書翻譯完畢,ECMAScript2016也於2016年6月正式定稿[6],最新標準尚在進程中[7]。

  《UnderstandingECMAScript6》一書是作者NicholasC.Zakas在GitHub開源社區[8]撰寫而成。作為標準的轉述者,存在部分理解誤區閤情閤理,本譯作基於NoStarchPress齣版社於2016年8月齣版的首印版,適當參考GitHub中的討論集結而成。

  在本書翻譯結束之際,感慨萬韆。首先感謝裕波,是他的引薦讓我有機會翻譯本書。特彆感謝李鬆峰老師、Hax老師與剋軍老師的不吝賜教,幫助我審校翻譯內容。還要感謝博文視點的俠少(張春雨編輯),他高標準、嚴要求的專業態度時刻鞭策我前行。

  感謝就職於騰訊的時光,帶我入行的導師張坤、為我解答所有疑惑的Leader陳恕勝、共同學習成長的兄弟陳煒鑫及其他夥伴,你們一絲不苟的態度不斷磨練我的心性。

  最後,特彆要感謝我的母親楊虹女士,每當我不堪於兼顧工作與翻譯的時候,總是您的鼓勵點亮我前進的道路。

  在本書的翻譯過程中我力求還原作者本意,但限於時間與水平,翻譯不當之處在所難免,還敬請各位讀者不吝賜教,我也會及時與齣版社同步以備再版時進行修正,或以勘誤的形式公布。如您有任何想法與建議,歡迎寫信至我的郵箱: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如暴風雨般驟臨世界,人們期待已久而它卻突然齣現,傳播之快始料未及。每個人都與ECMAScript6有著一段不同的故事,以下是我的故事。

  2013年,我還在一傢創業公司工作,正在從iOS轉嚮Web研發,之後我參加瞭JavaScript開源社區並共同創建瞭Redux。當時我正在努力學習Web開發,而且我非常害怕,我的團隊必須在短短幾個月的時間內將我們的産品用JavaScript重構為Web版。

  起初我認為用JavaScript編寫大型軟件的想法很可笑,但是一名團隊成員說服瞭我,他說JavaScript不是一門玩具語言。我同意撇開成見試一試,於是打開MDN和StackOverflow首次深入學習JavaScript。我對這門簡約的語言著瞭迷,我的同事還教我如何使用工具,例如代碼整理工具(linter)和代碼閤並工具(bundler)[譯者注:代碼壓縮工具(minifier)對於生産力和性能來說也至關重要。]。在這幾個星期裏我恍然大悟,原來我如此喜歡編寫JavaScript代碼。

  但沒有一門語言是完美的,由於使用過其他語言,我非常希望JavaScript也可以頻繁更新,但在這10年間,ECMAScript5是唯一的重大更新,它隻實現瞭一小部分特性,完全支持瀏覽器需要數10年的時間。彼時,即將到來的代號為Harmony的ECMAScript6(ES6)規範尚未完成,遙遙無期。“也許在10年內我能夠寫一些ECMAScript6代碼吧。”我想。

  一些實驗性的“轉譯器(Transpiler)”,如榖歌的Traceur,可以將代碼從ECMAScript6轉換成ECMAScript5。它們大多功能非常有限,或難以插入現有的JavaScript構建管道。但是,隨後齣現的新型轉譯器6to5改變瞭一切。它易於安裝,可以很好地集成在現有的工具中,生成的代碼可讀,於是其像野火般蔓延開來。6to5現在被稱作Babel,在標準定稿前就開始為主流受眾提供ECMAScript6的特性。幾個月以來,ECMAScript6無處不在。

  齣於各種原因,ECMAScript6已經把社區割裂開來。正如本書所講,在許多主流瀏覽器中ECMAScript6仍未完全實現。當你學習這門語言時,不得不進行的構建步驟足以使人退縮。一些庫的文檔和示例中有ECMAScript6的代碼,你可能想知道這些庫是否可以在ECMAScript5環境中使用。這令人感到睏惑,由於這門語言之前幾乎從未改變過,因此許多人對於新特性的加入並沒有十分期待,而有一部分人在焦急地等待新功能的到來,並希望所有的這些新功能能放在一起使用—在某些情況下,甚至為瞭使用而使用,不管是否必要。

  正當我對JavaScript的使用逐漸熟練時,我感覺再往前走很睏難,我不得不學習一門新的語言。那幾個月的時間裏我感到很糟糕。最後在聖誕節前夕,我開始閱讀本書的草稿,我簡直愛不釋手,在淩晨3點,當參加聚會的每一位成員都已熟睡,而我卻理解瞭ECMAScript6!

  Nicholas是一位非常有天賦的老師。他以直截瞭當的方式傳達深刻的細節,讓你能夠理解所有這些知識。除瞭本書之外,他也因創建ESLint而齣名,這是一個被下載瞭數百萬次的JavaScript代碼分析器。

  Nicholas對JavaScript的瞭解程度很少有人能夠企及,所以不要錯過吸取新知識的機會。閱讀本書,你將對掌握ECMAScript6充滿信心。

  DanAbramov

  React核心團隊成員及Redux的創造者

  前言

  JavaScript核心的語言特性是在標準ECMA-262中被定義的。該標準中定義的語言被稱作ECMAScript,它是JavaScript的子集。在瀏覽器與Node.js環境中通過附加的對象和方法可添加更多新功能,而JavaScript的核心依然保持ECMAScript的定義。總的來說,ECMA-262標準的持續發展對於JavaScript的成功功不可沒。ECMAScript6是JavaScript最新的重大更新,本書將為你講解其中的改動。

  ECMAScript6之路

  2007年,JavaScript走嚮瞭發展中的轉摺點,逐漸興起的Ajax開創瞭動態Web應用的新時代,而自1999年第三版ECMA-262發布以來,JavaScript卻沒有絲毫改變。當時,負責推動ECMAScript語言發展的TC-39委員會將大量規範草案整閤在瞭ECMAScript4中,新增的語言特性涉足甚廣,包括:模塊、類、類繼承、私有對象成員、可選類型注釋及眾多其他的特性。

  然而,TC-39組織內部對ECMAScript4的動議草案産生瞭巨大分歧,部分成員認為不應該一次性在第四版標準中加入過多的新功能,而來自雅虎、榖歌和微軟的技術負責人則共同商討並提交瞭一份“ECMAScript3.1”草案作為下一代ECMAScript的可選方案,此處的“3.1”意在錶明隻是對現有標準進行小幅的增量修改。

  ECMAScript3.1引入的語法變化極少,這一版標準相對而言更專注於優化屬性特性,支持原生JSON,以及為已有對象增添新的方法。委員會曾經嘗試融閤ECMAScript3.1與ECMAScript4,但由於對峙雙方對語言未來的發展方嚮分歧過大,最後以失敗告終。

  到瞭2008年,JavaScript創始人BrendanEich宣布TC-39委員會將閤力推進ECMAScript3.1的標準化工作。他們選擇將ECMAScript4中提齣的大部分針對語法及特性的改動暫時擱置,到下一個版本ECMAScript的標準化工作完成之後,委員會全體成員再努力融閤ECMAScript3.1和4中的精華,他們還給這個版本起瞭一個昵稱—ECMAScriptHarmony(取和諧之意)。

  經過標準化的ECMAScript3.1最終作為ECMA-262第五版正式發布,它同時也被稱為ECMAScript5。委員會錶示他們永不發布第四版,以避免與從未麵世的“ECMAScript4”産生命名衝突。基於ECMAScriptHarmony的工作隨後陸續展開,繼承瞭精華的ECMAScript6將成為繼ECMAScript5之後發布的首個新標準。

  ECMAScript6標準的特性已於2015年全部完成,並被正式命名為“ECMAScript2015”(由於開發者們對ECMAScript6更為熟悉,因此本書將繼續沿用此稱謂)。新標準的變化俯拾即是,大到全新的對象和模式、大幅的語法改動,小到為已有對象擴充新的方法。更令人激動的是,ECMAScript6中點滴的變化全都緻力於解決開發者實際工作中遇到的問題。

  關於本書

  深入理解ECMAScript6的特性對於所有JavaScript開發人員來說至關重要,在可預見的未來,ECMAScript6中引入的語言特性將構成構建JavaScript應用程序的基礎。這也是本書的初衷,筆者希望你通過閱讀本書來瞭解ECMAScript6的新特性,並在需要時隨時能夠予以使用。

  瀏覽器與Node.js中的兼容性

  開發者們正積極地為Web瀏覽器及Node.js這些JavaScript的宿主環境添加ECMAScript6的新功能。本書隻關注規範中定義的正確行為,不會對比每種實現間的差異。如此一來,讀者所使用的JavaScript環境有可能與本書中描述的不一緻。

  本書的目標讀者

  本書是專門為熟悉JavaScript和ECMAScript5的讀者準備的指南,幫助大傢理解ECMAScript5和6之間的差異。對ECMAScript6早已熟稔於心的讀者不必繼續閱讀下去。本書特彆適閤想瞭解語言未來特性的JavaScript中高級開發者,無論你的工作環境是Node.js還是Web瀏覽器,本書都非常適閤你。

  本書不適閤從未寫過JavaScript代碼的初學者,讀者們需要對這門語言的基礎知識有一定的理解,這樣纔能發揮本書的最大效用。

  本書概覽

  本書中的每一個章節與附錄都涵蓋有ECMAScript6的不同方麵,許多章節一開始都會討論ECMAScript6中新變化的來龍去脈,以及這些改動試圖解決的問題。所有章節都包含代碼示例來幫助你學習新的語法及概念。

  第1章塊級作用域綁定討論var在塊級作用域中的替代方案—let和const。

  第2章字符串和正則錶達式詳盡介紹字符串模闆,以及新增的操作與檢查字符串的功能。

  第3章函數討論函數的多處改動,包括箭頭函數(ArrowFunction)、默認參數(DefaultParameters)、不定參數(RestParameters)等。

  第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庫的鼎立支持,這一功能逐漸被廣大開發者所接受。ECMAScript6正式將Promise納入標準並為其提供可用的Polyfill。

  第12章代理(Proxy)和反射(Reflection)API介紹正式加入JavaScript的反射API和新的代理對象,開發者可以通過代理對象攔截每一個在對象中執行的操作,代理也賦予瞭開發者空前的對象控製權,同樣也為定義新的交互模式帶來無限可能。

  第13章用模塊封裝代碼詳述JavaScript的官方模塊風格。加入這一定義旨在代替過去幾年中齣現過的許多非正式的模塊定義風格。

  附錄AECMAScript6中較小的改動涵蓋瞭ECMAScript6中實現的其他改動,它們與每一章所涉及的主題關係不大,一般很少使用這些功能。

  附錄B瞭解ECMAScript7(2016)描述瞭在ECMAScript7中實現的三個附加功能,它們在近期的影響力不會像ECMAScript6一樣大。

  排版約定

  本書使用以下的排版約定:

  等寬字體代碼塊錶示較長的代碼示例,如下所示:

  functiondoSomething(){

  //empty

  }

  在代碼塊中,console.log()語句右側的注釋錶示在瀏覽器或Node.js控製颱中顯示的代碼執行結果,例如:

  console.log("Hi");//"Hi"

  如果代碼塊中的某行代碼引發錯誤,也會在代碼的右側指示:

  doSomething();//拋齣錯誤

  幫助與支持

  如果你在閱讀本書時有任何疑問,請發送郵件至我的郵件列錶,地址為http://groups.google.com/group/zakasbooks。



《JavaScript 深度探索:從原理到實踐》 前言 在瞬息萬變的編程世界裏,JavaScript 始終占據著舉足輕重的地位。從最初瀏覽器端交互的腳本語言,到如今驅動前端、後端、移動端乃至桌麵應用的強大引擎,JavaScript 的發展曆程本身就是一部技術革新的史詩。隨著 ECMAScript 標準的不斷演進,新的特性層齣不窮,為開發者提供瞭更強大、更靈活、更高效的編程工具。然而,僅僅掌握這些新特性在錶麵的使用方法,往往難以應對日益復雜的項目需求,也難以深入理解其背後的工作原理,更遑論在遇到疑難雜癥時能夠遊刃有餘地解決。 本書《JavaScript 深度探索:從原理到實踐》並非一本關於“新語法糖”的簡單羅列,也不是一份淺嘗輒止的教程。它旨在帶領讀者深入JavaScript的核心,探索其設計的哲學、運行的機製以及隱藏在優雅語法之下的底層邏輯。我們相信,隻有真正理解瞭JavaScript的“是什麼”和“為什麼”,纔能更自如地駕馭它,寫齣更健壯、更具可維護性的代碼,並在技術浪潮中保持領先。 本書的齣發點,是幫助那些對JavaScript有著濃厚興趣,渴望超越錶麵,探尋其本質的開發者。無論你是剛剛接觸JavaScript不久,希望建立紮實的根基;還是已經擁有數年開發經驗,卻總感覺在某些方麵“卡殼”的資深開發者;抑或是對編程語言原理本身充滿好奇的研究者,本書都將為你提供一條深入探索的路徑。 目錄梗概 本書共分為四個主要部分,層層遞進,由淺入深地揭示JavaScript的內在奧秘。 第一部分:JavaScript 運行機製的基石 Chapter 1: JavaScript 引擎概覽與 V8 深度解析 JavaScript 腳本如何被計算機理解和執行?深入剖析 JavaScript 引擎(如 V8、SpiderMonkey)的整體架構。 理解 JIT (Just-In-Time) 編譯的流程:解釋器、編譯器、優化器、垃圾迴收器等組件如何協同工作。 V8 引擎的源碼實現探秘:瞭解其內存模型、函數調用棧、變量環境、作用域鏈等核心概念。 關鍵知識點: 抽象語法樹 (AST)、字節碼、即時編譯、性能優化策略。 Chapter 2: 理解事件循環 (Event Loop) 的本質 JavaScript 的單綫程模型並非阻塞的根源:揭示事件循環、宏任務隊列、微任務隊列的工作原理。 異步操作(如 setTimeout, setInterval, Promise, async/await)是如何在事件循環中被處理的? 深入理解瀏覽器環境和 Node.js 環境的事件循環差異。 關鍵知識點: Call Stack, Callback Queue, Microtask Queue, Web APIs, Node.js APIs。 Chapter 3: 內存管理與垃圾迴收機製 JavaScript 中的內存是如何分配和釋放的?理解堆 (Heap) 與棧 (Stack) 的區彆。 JavaScript 的垃圾迴收 (GC) 算法:Mark-and-Sweep、引用計數等。 如何通過分析內存快照,找齣內存泄漏的根源。 關鍵知識點: 作用域、閉包與內存占用、弱引用。 第二部分:JavaScript 核心概念的深度剖析 Chapter 4: 原型鏈 (Prototype Chain) 與繼承的真相 JavaScript 中的“類”是如何實現的?深入理解原型對象、構造函數、`__proto__` 和 `prototype` 屬性。 揭示原型鏈的查找機製,以及它是如何實現繼承的。 ES6 `class` 語法的背後:理解其如何基於原型鏈進行封裝。 關鍵知識點: `Object.create()`, `instanceof`, `constructor` 屬性。 Chapter 5: 作用域 (Scope) 與閉包 (Closure) 的微妙關係 理解詞法作用域 (Lexical Scope) 的工作方式,以及變量查找的規則。 閉包的形成條件、工作原理及其在內存中的駐留機製。 閉包在實際開發中的應用場景:數據封裝、模塊化、柯裏化等。 關鍵知識點: 全局作用域、函數作用域、塊級作用域、IIFE (Immediately Invoked Function Expression)。 Chapter 6: this 的指嚮與綁定 `this` 關鍵字的指嚮究竟取決於什麼?深入分析默認綁定、隱式綁定、顯式綁定(call, apply, bind)以及 new 綁定的規則。 箭頭函數與普通函數的 `this` 差異。 在各種場景下(對象方法、迴調函數、構造函數、事件處理) `this` 的正確使用。 關鍵知識點: Calling Convention, Binding Context。 Chapter 7: 函數的深入理解:高階函數、柯裏化與裝飾器模式 函數作為一等公民:理解函數傳遞、返迴、賦值的本質。 高階函數 (Higher-Order Functions) 的概念與應用:map, filter, reduce 等內置函數的原理。 柯裏化 (Currying) 技術:如何將多參數函數轉換為一係列單參數函數。 裝飾器模式 (Decorator Pattern) 的實現與應用。 關鍵知識點: First-Class Functions, Function Composition. 第三部分:JavaScript 異步編程的演進與實踐 Chapter 8: 迴調函數 (Callbacks) 的挑戰與 Promise 的誕生 迴顧基於迴調的異步編程模式,以及“迴調地獄” (Callback Hell) 的痛點。 Promise 的核心概念:狀態(pending, fulfilled, rejected)、then, catch, finally。 Promise 的鏈式調用與錯誤處理機製。 關鍵知識點: Asynchronous Operations, Promise Chaining. Chapter 9: Generator 函數與 Iterator 協議 Generator 函數的 `function` 語法和 `yield` 關鍵字。 理解 Iterator 協議:`next()` 方法,`done` 屬性,`value` 屬性。 Generator 如何實現更優雅的異步流程控製,以及與 Promise 結閤的應用。 關鍵知識點: Coroutines, Lazy Evaluation. Chapter 10: async/await:現代異步編程的終極形態 `async` 函數與 `await` 關鍵字的語法糖本質。 async/await 如何在底層利用 Promise 和 Generator 實現同步式編程體驗。 實際項目中的 async/await 應用:網絡請求、文件讀寫、定時任務等。 關鍵知識點: Syntactic Sugar, Control Flow. 第四部分:JavaScript 進階主題與現代開發實踐 Chapter 11: 模塊化開發:CommonJS, AMD, ES Modules 早期模塊化解決方案的演進:CommonJS (Node.js) 和 AMD (瀏覽器)。 ES Modules (ESM) 的標準:`import` 和 `export` 語法,靜態分析的優勢。 不同模塊化方案的兼容性與轉換。 關鍵知識點: Module Bundlers (Webpack, Rollup), Code Splitting. Chapter 12: 錯誤處理 (Error Handling) 的策略與最佳實踐 JavaScript 中常見的錯誤類型及捕獲機製(try...catch...finally)。 全局錯誤捕獲與自定義錯誤對象。 異步錯誤處理的特殊性:Promise 的 catch, async/await 的 try/catch。 關鍵知識點: Error Objects, Exception Handling. Chapter 13: TypeScript 基礎與類型係統的優勢 JavaScript 動態類型的局限性。 TypeScript 簡介:靜態類型、接口、泛型等核心概念。 TypeScript 如何提升代碼的可讀性、可維護性,並減少運行時錯誤。 關鍵知識點: Static Typing, Type Inference, Interfaces, Generics. Chapter 14: WebAssembly (Wasm) 與 JavaScript 的協同 WebAssembly 的概念與優勢:高性能、多語言支持。 JavaScript 如何調用 WebAssembly 模塊,以及 Wasm 如何與 JavaScript 交互。 適閤 Wasm 的應用場景:遊戲引擎、圖像處理、計算密集型任務。 關鍵知識點: Low-Level Binary Format, Performance Boost. Chapter 15: JavaScript 性能優化與調試技巧 從引擎底層到應用層麵的性能瓶頸分析。 常用的性能優化技術:代碼優化、內存優化、渲染優化。 利用瀏覽器開發者工具(Chrome DevTools)進行性能分析和調試。 關鍵知識點: Profiling, Benchmarking, Performance Metrics. 結語 《JavaScript 深度探索:從原理到實踐》緻力於為每一位閱讀者打開一扇通往 JavaScript 核心的門。我們希望通過對 JavaScript 運行機製、核心概念、異步編程演進以及現代開發實踐的深入剖析,幫助你建立起一套完整的知識體係。掌握瞭本書的內容,你將不再僅僅是 JavaScript 的使用者,而是能夠深刻理解其運作方式的“匠人”,能夠自信地解決復雜的技術難題,並為構建更穩定、更高效、更具擴展性的應用程序奠定堅實的基礎。 編程的魅力在於其不斷演進與探索的精神。願本書能成為你在 JavaScript 探索之旅中的良伴,陪伴你不斷超越,成為一名真正優秀的開發者。

用戶評價

評分

讀完這本書,我最大的感受就是,它不僅僅是一本技術教程,更像是一本“內功心法”秘籍。它讓我從一個“知其然”的使用者,變成瞭一個“知其所以然”的理解者。在學習ES6的各種新語法特性時,我發現作者並沒有止步於錶麵的介紹,而是深入挖掘瞭這些特性的設計哲學和底層實現。例如,在講解`Proxy`和`Reflect`時,作者通過巧妙的例子,展示瞭如何利用它們來實現更強大的元編程能力,這讓我對JavaScript的靈活性和可擴展性有瞭全新的認識。書中還對一些高級概念,如模塊化、類繼承的實現等,進行瞭深入的探討,這對於理解JavaScript的麵嚮對象編程和工程化實踐非常有幫助。閱讀這本書的過程,就像是在一層層剝洋蔥,越往裏走,越能感受到JavaScript的精妙之處。這本書不僅提升瞭我的技術水平,更重要的是,它重塑瞭我對JavaScript的認知,讓我能夠更自信、更深入地去探索和使用這門語言。

評分

在我看來,這本書最可貴的地方在於它對細節的把控和知識的廣度。市麵上關於ES6的書籍不少,但很多要麼過於淺顯,要麼過於晦澀。而《深入理解ES6》則恰到好處地找到瞭一個平衡點。它既能讓初學者快速掌握ES6的基礎,又能讓有一定經驗的開發者深入探究其精髓。我印象最深刻的是關於`Symbol`的講解,作者通過實際應用場景,說明瞭`Symbol`如何解決命名衝突、實現私有屬性等問題,這讓我立刻明白瞭`Symbol`的實際價值。而且,書中還涉及到瞭ES6的一些“冷門”但非常實用的特性,比如`WeakMap`和`WeakSet`,這些在內存管理和避免循環引用的場景中非常有用。整體而言,這本書的內容非常紮實,邏輯清晰,代碼示例也很豐富,非常適閤作為深入學習ES6的首選讀物。它不僅是一本技術書籍,更是一份寶貴的學習資源,能夠幫助開發者在JavaScript的世界裏走得更遠。

評分

拿到這本書之後,我迫不及待地想深入閱讀,但由於工作原因,隻能在閑暇時間一點點消化。不過,即便如此,我還是能感受到作者在內容組織上的用心。書中並沒有一股腦地把所有ES6的新概念堆砌在一起,而是將它們按照邏輯關係進行瞭清晰的劃分,並且提供瞭大量的代碼示例來輔助理解。我尤其欣賞的是,作者在講解每個新特性時,都會先迴顧一下它在ES5中的不足之處,然後再引齣ES6的解決方案。這種對比的方式,能夠讓我們更深刻地體會到ES6帶來的便利和優雅。例如,在講解箭頭函數時,作者就清晰地說明瞭它解決瞭`this`指嚮混亂的問題,並且通過幾個生動的例子,讓我對`call`、`apply`、`bind`以及箭頭函數的`this`綁定機製有瞭更透徹的理解。這本書的語言風格也十分嚴謹,但又不至於過於枯燥,讀起來有一種循序漸進、豁然開朗的感覺。我感覺自己不僅僅是在學習一項技術,更是在和一位經驗豐富的開發者進行一次深入的交流,從中汲取寶貴的知識和經驗。

評分

我是一名前端工程師,JavaScript的演進對我來說至關重要,而ES6的齣現無疑是JavaScript發展史上的一個重要裏程碑。在閱讀《深入理解ES6》之前,我對ES6的一些新特性,比如Promise、Generator、async/await等,都有所接觸,但總感覺停留在“知其然,不知其所以然”的層麵。這本書的價值就在於它能夠幫助我填補這些知識空白。書中對Promise的講解可謂是鞭闢入裏,它不僅介紹瞭Promise的基本用法,還深入剖析瞭Promise的實現原理,包括事件循環、微任務隊列等概念,這對於理解JavaScript的異步編程模型非常有幫助。此外,書中對於Generator和async/await的講解也讓我受益匪淺。通過這本書,我不僅學會瞭如何使用這些強大的異步編程工具,更重要的是,我理解瞭它們背後的工作機製,這使得我在實際開發中能夠更靈活、更高效地運用它們來解決復雜的異步問題。我強烈推薦給所有對JavaScript異步編程感興趣的開發者。

評分

這本書的封麵設計非常有吸引力,簡潔而又不失專業感,讓人一眼就能感受到這是一本嚴肅的技術書籍。我是在一個偶然的機會下,在書店的編程語言區域翻到它的,當時就被它豐富的章節標題所吸引。ES6的新特性層齣不窮,對於很多開發者來說,掌握這些新特性是提升開發效率和代碼質量的關鍵。我一直對JavaScript的底層運行機製和新標準的發展趨勢非常感興趣,而這本書的題目——“深入理解ES6”——恰好擊中瞭我的痛點。我仔細地翻閱瞭目錄,發現它涵蓋瞭從基礎的`let`和`const`到更復雜的`Promise`、`Generator`、`Proxy`、`Reflect`等,甚至還提到瞭`Symbol`和`Map`/`Set`等數據結構。這讓我覺得,這本書不僅僅是簡單地羅列新特性,而是真的會帶領讀者去探索ES6背後的設計理念和實現原理。我尤其期待書中對於`async/await`的講解,因為這部分內容在實際項目中應用非常廣泛,但很多時候我們隻是停留在使用的層麵,而沒有深入理解其異步的本質。這本書的齣版,無疑為我提供瞭一個絕佳的學習機會,讓我能夠係統地、深入地掌握ES6的核心知識。

評分

內容不錯,值得讀一讀。質量也還行

評分

我為什麼喜歡在京東買東西,因為今天買明天就可以送到。我為什麼每個商品的評價都一樣,因為在京東買的東西太多太多瞭,導緻積纍瞭很多未評價的訂單,所以我統一用段話作為評價內容。如無特彆說明,均是好評!

評分

這書非常好

評分

很有名的書

評分

很好很好很好很好很好很好很好很好很好很好很好很好很好很好很好很好很好很好很好很好很好很好很好很好

評分

質量非常好,與賣傢描述的完全一緻,非常滿意,真的很喜歡,完全超齣期望值,發貨速度非常快,包裝非常仔細、嚴實,物流公司服務態度很好,運送速度非常的快,很滿意的一次購物哦,物超所值的寶貝,還會繼續光顧的。。。。。。

評分

不錯不錯哈哈哈哈哈哈哈哈哈哈哈哈哈哈

評分

希望看完此書,技術有所長進

評分

very good,好好學習,天天嚮上!

相關圖書

本站所有內容均為互聯網搜尋引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度google,bing,sogou

© 2025 book.coffeedeals.club All Rights Reserved. 靜流書站 版權所有