産品特色
編輯推薦
JavaScript語言有很多復雜的概念,但卻用簡單的方式體現齣來(比如迴調函數),因此,JavaScript開發者無需理解語言內部的原理,就能編寫齣功能全麵的程序。然而,JavaScript的這些復雜精妙的概念纔是語言的精髓,即使是經驗豐富的JavaScript開發者,如果沒有認真學習,也無法真正理解語言本身的特性。正是因為絕大多數人不求甚解,一遇到齣乎意料的行為就認為是語言本身有缺陷,進而把相關的特性加入黑名單,久而久之就排除瞭這門語言的多樣性,人為地使它變得不完整、不安全。
“你不知道的JavaScript”係列就是要讓不求甚解的JavaScript開發者迎難而上,深入語言內部,弄清楚JavaScript每一個零部件的用途。本書介紹瞭該係列的兩個主題:“類型和語法”以及“異步和性能”。掌握瞭這些知識之後,無論什麼技術、框架和流行詞語,你都能輕鬆理解。
內容簡介
JavaScript這門語言簡單易用,很容易上手,但其語言機製復雜微妙,即使是經驗豐富的JavaScript開發人員,如果沒有認真學習的話也無法真正理解。本套書直麵當前JavaScript開發人員不求甚解的大趨勢,深入理解語言內部的機製,全麵介紹瞭JavaScript中常被人誤解和忽視的重要知識點。本書是其中捲,主要介紹瞭類型、語法、異步和性能。
作者簡介
Kyle Simpson
作傢、培訓師、講師、開源社區的活躍成員,推崇開放的互聯網,對JavaScript、HTML5、實時/端對端通信和Web性能有深入研究。
單業
計算機專業碩士,軟件工程師,曾供職於多傢軟件公司,從事軟件開發工作,現居於上海。負責本書第二部分“異步和性能”的翻譯。
薑南
從事過國內外金融、通信、移動互聯網、數字齣版等領域的IT係統開發工作,擅長的技術有Java、C#、HTML5、JavaScript、iOS、Android等。長期在獨立技術博客——酷殼(coolshell.cn)發錶翻譯文章。負責本書首部分“類型和語法”的翻譯。
目錄
目錄
前言 XI
第一部分 類型和語法
序 2
第1 章 類型 3
1.1 類型 4
1.2 內置類型 4
1.3 值和類型 6
1.3.1 undefined 和undeclared 6
1.3.2 typeof Undeclared 7
1.4 小結 10
第2 章 值 11
2.1 數組 11
2.2 字符串 13
2.3 數字 15
2.3.1 數字的語法 16
2.3.2 較小的數值 18
2.3.3 整數的安全範圍 19
2.3.4 整數檢測 20
2.3.5 32 位有符號整數 20
2.4 特殊數值 21
2.4.1 不是值的值 21
2.4.2 undefined 21
2.4.3 特殊的數字 23
2.4.4 特殊等式 27
2.5 值和引用 28
2.6 小結 31
第3 章 原生函數 33
3.1 內部屬性[[Class]] 34
3.2 封裝對象包裝 35
3.3 拆封 36
3.4 原生函數作為構造函數 37
3.4.1 Array(..) 37
3.4.2 Object(..)、Function(..) 和RegExp(..) 40
3.4.3 Date(..) 和Error(..) 41
3.4.4 Symbol(..) 42
3.4.5 原生原型 43
3.5 小結 45
第4 章 強製類型轉換 46
4.1 值類型轉換 46
4.2 抽象值操作 47
4.2.1 ToString 48
4.2.2 ToNumber 52
4.2.3 ToBoolean 53
4.3 顯式強製類型轉換 56
4.3.1 字符串和數字之間的顯式轉換 57
4.3.2 顯式解析數字字符串 62
4.3.3 顯式轉換為布爾值 65
4.4 隱式強製類型轉換 67
4.4.1 隱式地簡化 67
4.4.2 字符串和數字之間的隱式強製類型轉換 68
4.4.3 布爾值到數字的隱式強製類型轉換 71
4.4.4 隱式強製類型轉換為布爾值 72
4.4.5 || 和 73
4.4.6 符號的強製類型轉換 76
4.5 寬鬆相等和嚴格相等 77
4.5.1 相等比較操作的性能 .77
4.5.2 抽象相等
4.6 抽象關係比較 89
4.7 小結 91
第5 章 語法 92
5.1 語句和錶達式 92
5.1.1 語句的結果值 93
5.1.2 錶達式的副作用 95
5.1.3 上下文規則 99
5.2 運算符優先級 104
5.2.1 短路 107
5.2.2 更強的綁定 107
5.2.3 關聯 108
5.2.4 釋疑 110
5.3 自動分號 111
5.4 錯誤 113
5.5 函數參數 115
5.6 try..finally 117
5.7 switch 120
5.8 小結 122
附錄A 混閤環境JavaScript 123
第二部分 異步和性能
序 136
第1 章 異步:現在與將來 138
1.1 分塊的程序 139
1.2 事件循環 141
1.3 並行綫程 143
1.4 並發 148
1.4.1 非交互 150
1.4.2 交互 150
1.4.3 協作 154
1.5 任務 156
1.6 語句順序 157
1.7 小結 159
第2 章 迴調 161
2.1 continuation 162
2.2 順序的大腦 163
2.2.1 執行與計劃 164
2.2.2 嵌套迴調與鏈式迴調 165
2.3 信任問題 169
2.3.1 五個迴調的故事 170
2.3.2 不隻是彆人的代碼 171
2.4 省點迴調 173
2.5 小結 176
第3 章 Promise 178
3.1 什麼是Promise 179
3.1.1 未來值 179
3.1.2 完成事件 183
3.2 具有then 方法的鴨子類型 188
3.3 Promise 信任問題 190
3.3.1 調用過早 190
3.3.2 調用過晚 191
3.3.3 迴調未調用 192
3.3.4 調用次數過少或過多 193
3.3.5 未能傳遞參數/ 環境值 193
3.3.6 吞掉錯誤或異常 194
3.3.7 是可信任的Promise 嗎 195
3.3.8 建立信任 197
3.4 鏈式流 198
3.5 錯誤處理 206
3.5.1 絕望的陷阱 208
3.5.2 處理未捕獲的情況 209
3.5.3 成功的坑 211
3.6 Promise 模式 212
3.6.1 Promise.all([ .. ]) 212
3.6.2 Promise.race([ .. ]) 213
3.6.3 all([ .. ]) 和race([ .. ]) 的變體 216
3.6.4 並發迭代 217
3.7 Promise API 概述 219
3.7.1 new Promise(..) 構造器 219
3.7.2 Promise.resolve(..) 和Promise.reject(..) 219
3.7.3 then(..) 和catch(..) 220
3.7.4 Promise.all([ .. ]) 和Promise.race([ .. ]) 221
3.8 Promise 局限性 222
3.8.1 順序錯誤處理 222
3.8.2 單一值 223
3.8.3 單決議 225
3.8.4 慣性 227
3.8.5 無法取消的Promise 230
3.8.6 Promise 性能 231
3.9 小結 233
第4 章 生成器 234
4.1 打破完整運行 234
4.1.1 輸入和輸齣 236
4.1.2 多個迭代器 239
4.2 生成器産生值 243
4.2.1 生産者與迭代器 243
4.2.2 iterable 246
4.2.3 生成器迭代器 247
4.3 異步迭代生成器 250
4.4 生成器+Promise 254
4.4.1 支持Promise 的Generator Runner 256
4.4.2 生成器中的Promise 並發 258
4.5 生成器委托 262
4.5.1 為什麼用委托 264
4.5.2 消息委托 264
4.5.3 異步委托 268
4.5.4 遞歸委托 268
4.6 生成器並發 269
4.7 形實轉換程序 273
4.8 ES6 之前的生成器 279
4.8.1 手工變換 280
4.8.2 自動轉換 284
4.9 小結 285
第5 章 程序性能 287
5.1 Web Worker 288
5.1.1 Worker 環境 290
5.1.2 數據傳遞 291
5.1.3 共享Worker 291
5.1.4 模擬Web Worker 293
5.2 SIMD 293
5.3 asm.js 295
5.3.1 如何使用asm.js 優化 295
5.3.2 asm.js 模塊 296
5.4 小結 298
第6 章 性能測試與調優 299
6.1 性能測試 99
6.1.1 重復 300
6.1.2 Benchmark.js 301
6.2 環境為王 303
6.3 jsPerf.com 305
6.4 寫好測試 309
6.5 微性能 309
6.5.1 不是所有的引擎都類似 312
6.5.2 大局 314
6.6 尾調用優化 316
6.7 小結 318
附錄A asynquence 庫 319
附錄B 高級異步模式 339
你不知道的JavaScript(中捲):深度解析現代JavaScript核心機製 引言 JavaScript,這個曾被認為是“簡單腳本語言”的語言,如今已成為構建現代Web應用、服務器端程序,甚至桌麵應用和移動應用的基石。其飛速發展的生態和不斷演進的標準,讓無數開發者沉醉其中,也為深入理解其內在機製帶來瞭挑戰。本書《你不知道的JavaScript(中捲)》並非一本簡單的入門指南,而是一次對JavaScript核心機製的深度挖掘,旨在幫助開發者超越錶麵的API調用,理解語言底層的工作原理,從而寫齣更健壯、更高效、更易於維護的代碼。 本書專注於JavaScript的核心語言特性,特彆是那些經常被誤解、被忽略,但卻至關重要的概念。它將帶領你穿越JavaScript的語言規範,解析那些“看不見的”機製,揭示語言設計背後的思想,讓你真正掌握JavaScript這門強大的語言。 第一部分:作用域與閉包 (Scope and Closures) 作用域是JavaScript中一個極其重要的概念,它決定瞭變量的可訪問性和生命周期。許多開發者在編寫代碼時,對作用域的理解僅停留在“函數內部的變量是局部的”。然而,JavaScript的作用域機製遠比這復雜得多。 詞法作用域 (Lexical Scoping): 本捲將深入探討JavaScript所采用的詞法作用域模型。這意味著變量的作用域在代碼編寫時就已經確定,而不是在代碼運行時纔確定。我們將分析作用域鏈 (Scope Chain) 的形成機製,以及JavaScript引擎如何通過作用域鏈查找變量。理解詞法作用域是理解閉包的基礎。 函數作用域與塊級作用域 (Function Scope vs. Block Scope): 通過對比 `var`、`let` 和 `const` 的不同行為,我們將詳細闡述函數作用域和塊級作用域的區彆,以及它們對變量生命周期和可訪問性的影響。掌握塊級作用域對於編寫更清晰、更易於管理的現代JavaScript代碼至關重要。 閉包 (Closures): 閉包是JavaScript中最強大也最容易被誤用的特性之一。本書將徹底解構閉包的概念,解釋它是如何形成的,以及它與詞法作用域的關係。我們將通過豐富的實例,展示閉包在模塊化、數據封裝、函數工廠、延遲執行等場景中的實際應用,並分析其潛在的內存泄漏風險及規避方法。理解閉包,意味著你掌握瞭JavaScript函數式編程的精髓。 第二部分:對象與原型 (Objects and Prototypes) JavaScript的麵嚮對象模型與傳統的類繼承模型有著本質的區彆。本書將深入剖析JavaScript的對象模型,揭示其基於原型的繼承機製。 對象字麵量與構造函數 (Object Literals and Constructor Functions): 我們將從最基礎的對象創建方式——對象字麵量和構造函數入手,理解它們是如何創建對象的,以及它們與 `new` 關鍵字的關係。 `this` 關鍵字的陷阱與優雅 (The `this` Keyword: Traps and Elegance): `this` 關鍵字是JavaScript中最令人睏惑的關鍵字之一,它的指嚮在不同的調用上下文中會發生變化。本書將係統性地分析 `this` 的綁定規則,包括默認綁定、隱式綁定、顯式綁定 (`call`、`apply`、`bind`) 以及通過 `new` 關鍵字綁定的情況。通過大量的實例,幫助你徹底掌握 `this` 的指嚮,避免常見的錯誤。 原型鏈 (Prototype Chain): JavaScript的繼承是通過原型鏈實現的。我們將詳細講解原型 (`prototype`) 和原型鏈的概念,以及對象是如何通過原型鏈查找屬性和方法的。理解原型鏈是理解JavaScript麵嚮對象編程的關鍵。 `__proto__` 和 `Object.create()` (The `__proto__` and `Object.create()`): 本捲將介紹 `__proto__` 屬性(雖然不推薦直接使用)和 `Object.create()` 方法,它們是操作和理解原型鏈的重要工具。通過 `Object.create()`,你可以更精細地控製對象的原型,從而實現更靈活的繼承模式。 構造函數、原型和實例的關係 (Constructor, Prototype, and Instance Relationships): 深入理解構造函數、其 `prototype` 屬性以及實例對象三者之間的錯綜復雜的關係,能夠幫助你更清晰地認識JavaScript的麵嚮對象本質。 第三部分:異步編程 (Asynchronous Programming) 在現代Web開發中,異步編程幾乎無處不在。從網絡請求到用戶交互,再到定時任務,JavaScript都需要處理大量的異步操作。本書將全麵講解JavaScript的異步編程模型。 事件循環 (Event Loop): 本捲將深入解析JavaScript的事件循環機製。我們將理解調用棧 (Call Stack)、任務隊列 (Task Queue)(包括宏任務和微任務)是如何協同工作的,以及它們如何實現異步操作的非阻塞執行。清晰地理解事件循環是掌握JavaScript異步編程的基礎。 迴調函數 (Callback Functions): 迴調函數是JavaScript中最早的異步處理方式。我們將分析迴調函數的優點和缺點,特彆是“迴調地獄” (Callback Hell) 的問題,並探討如何通過一些模式來改善代碼的可讀性。 Promise: Promise 是ES6引入的,用於更優雅地處理異步操作。本書將詳細講解Promise的狀態(pending, fulfilled, rejected),Promise的鏈式調用,以及如何使用 `then`、`catch` 和 `all` 等方法來管理異步流程。Promise極大地簡化瞭異步編程,使得代碼邏輯更加清晰。 Generator 函數: Generator 函數是ES6引入的一種特殊的函數,它可以暫停執行並稍後恢復。我們將講解Generator函數的語法,以及如何使用 `yield` 關鍵字來控製函數的執行流程。Generator函數為異步編程提供瞭更強大的控製力,並且是實現協程 (Coroutines) 的基礎。 Async/Await: Async/Await 是ES7(ES2017)引入的,它建立在Promise的基礎上,提供瞭更加同步風格的異步編程體驗。本書將深入講解 `async` 和 `await` 關鍵字的用法,以及它們如何結閤Promise,使得異步代碼的編寫和閱讀變得更加直觀和容易。你將學會如何用同步的思維來編寫異步代碼,極大地提升開發效率和代碼質量。 結論 《你不知道的JavaScript(中捲)》不是一本“讀完就懂”的書,它是一份邀請,邀請你踏上深入探索JavaScript之旅。通過對作用域、閉包、對象、原型以及異步編程等核心機製的細緻剖析,本書將幫助你建立起對JavaScript更深刻、更本質的理解。掌握瞭這些基礎,你將能夠更自信地駕馭JavaScript這門語言,寫齣更高效、更健壯、更具錶現力的代碼,真正成為一名JavaScript的“內行”。無論你是希望鞏固基礎、解決疑難雜癥,還是為進一步探索JavaScript的高級特性打下堅實基礎,本書都將是你不可或缺的寶貴資源。