JavaScript核心原理:規範、邏輯與設計

周愛民

  • 出版商: 人民郵電
  • 出版日期: 2023-07-01
  • 定價: $599
  • 售價: 8.5$509
  • 語言: 簡體中文
  • 頁數: 304
  • ISBN: 711560892X
  • ISBN-13: 9787115608925
  • 相關分類: JavaScript
  • 立即出貨

  • JavaScript核心原理:規範、邏輯與設計-preview-1
  • JavaScript核心原理:規範、邏輯與設計-preview-2
JavaScript核心原理:規範、邏輯與設計-preview-1

買這商品的人也買了...

商品描述

本書是一本JavaScript精進指南,系統剖析JavaScript的核心技術。全書共分為6篇,第一篇講解JavaScript的基礎概念,第二篇講解JavaScript的運行過程,第三篇講解JavaScript面向對象編程體系中最核心的設計,第四篇講解JavaScript作為動態語言的主要特性,第五篇講解JavaScript作為並行語言的主要持性,第六篇講解ECMAScript 2019之後的新增特性,並對ECMAScript 2022之後將添加的特性進行解析。 每章用一行代碼引出,所講內容包括該行代碼的特殊性、所涉問題的領域、逐步的解析、相似或同類的問題、潛在的應用、不為人知的歷史、標準規範對此代碼的態度、業界的看法與爭議等。 本書適合有一定編程基礎的JavaScript開發人員與深度愛好者閱讀,幫助讀者深入理解JavaScript核心原理,實現從粗通到精通的進階。

作者簡介

周爱民,国内软件开发界资深架构师、软件工程师。有20余年的软件开发与架构、项目管理、团队建设的经验,曾任盛大网络平台架构师、支付业务架构师、豌豆英架构师和上海南潮架构师等职。从1998年开始了解并应用JavaScript,著有前端“绿皮书”《JavaScript语言精髓与编程实践》,曾发布Qomo、 QoBean及分布式架构框架N4C等开源项目。已出版的其他作品有《大道至简》 《大道至易》和《Delphi源代码分析》。

目錄大綱

第 一篇 從零開始:重新認識JavaScript語言的基礎概念

第 1章 生存周期:JavaScript變量與引用的銷毀 2

1.1 習慣中用“引用”來區別數據類型的操作方式 3

1.1.1 刪除運算到底在試圖銷毀什麽 4

1.1.2 表達式的結果是什麽 4

1.2 深入理解“引用(規範類型)” 5

1.3 引用在引擎內部的主要行為 6

1.4 從引用的發現到銷毀 6

1.5 小結 7

第 2章 賦值:賦值過程中出現變量泄露的原因 9

2.1 從變量聲明到賦值綁定的全程解析 10

2.1.1 賦值在語言設計中稱為綁定 11

2.1.2 用賦值語法實現綁定導致的問題 12

2.2 變量泄露:向一個不存在的變量賦值 12

2.3 在連續賦值過程中發生的行為細節 14

2.4 在應用中使用“賦值語句魔法”的技巧 15

2.5 小結 16

第3章 表達式:對運算過程的觀察與分析 17

3.1 在運算過程中丟失的數據的難解之謎 18

3.1.1 深度解析聲明語句與賦值表達式的語義差別 18

3.1.2 來自《JavaScript權威指南》的解釋 19

3.2 表達式連續運算過程中的變量、值與引用 20

3.3 用代碼重現引用覆蓋的現場 21

3.4 技術的取巧之處 22

3.5 小結 23

第4章 名字與導出:“有名字”是構建邏輯的基礎 24

4.1 能導出的只有名字和值 25

4.1.1 代碼就是文本 25

4.1.2 詳解export的語法與語義 25

4.2 export導出名字的具體邏輯 27

4.2.1 導出:同化名字與值的處理邏輯 27

4.2.2 綁定:通過執行頂層代碼實現的裝配過程 28

4.2.3 問題:函數表達式執行中不綁定名字 28

4.3 匿名函數定義及其名字處理 29

4.4 有關導出語句的一些補充 30

4.5 小結 31

第5章 作用域:循環計算成本高昂的原因 32

5.1 代碼分塊與塊級作用域 33

5.2 循環語句中的塊 34

5.2.1 特例 35

5.2.2 特例中的特例 35

5.3 第二個作用域的必要性 36

5.4 for循環在運行時需要更多作用域 37

5.5 小結 38

第二篇 從表達式到執行引擎:運行代碼的核心機制

第6章 執行環境的秘密:語句的運行與完成的視角 40

6.1 用中斷代替跳轉 41

6.1.1 跳轉到語句結束的位置 41

6.1.2 跳轉到標簽約定的位置 42

6.2 執行現場的回收 43

6.3 語句執行的意義 44

6.4 中斷語句的特殊性 45

6.4.1 最小化的break語句 46

6.4.2 返回empty的語句 46

6.5 小結 46

第7章 深入探索JavaScript中的特殊執行體 47

7.1 抽象確定邏輯的執行體 48

7.2 幾種特殊的可執行結構 48

7.2.1 參數表 48

7.2.2 擴展風格的參數表 49

7.2.3 賦值模式 50

7.3 模板字面量 52

7.4 小結 53

第8章 閉包、函數與函數式編程語言的關系 54

8.1 函數的一體兩面 55

8.1.1 在運行期一個實例有多個閉包 55

8.1.2 閉包用於承載兩個語義組件 56

8.2 簡單參數類型 57

8.2.1 傳入參數的處理 57

8.2.2 意外 58

8.2.3 未初始化綁定 58

8.3 最小化的函數式編程語言示例 59

8.4 小結 60

第9章 迭代過程及其出錯處理機制 61

9.1 遞歸與迭代 62

9.1.1 迭代對執行過程的重造和使用 63

9.1.2 展開語法 63

9.2 JavaScript中如何實現迭代處理 64

9.2.1 內部迭代過程 64

9.2.2 不可思議的異常處理邏輯 65

9.3 在迭代中處理異常的關鍵:誰是使用者 66

9.4 小結 68

第 10章 從迭代向生成器函數演進的過程 69

10.1 將迭代過程代表的循環邏輯展開 70

10.2 用生成器函數對循環邏輯進行二次重構 71

10.3 由next()方法負責執行引擎的喚起 73

10.4 為next()方法的傳入參數賦予新的意義 73

10.5 小結 74

第 11章 ECMAScript規範起步 75

11.1 第三行:返回結果 76

11.2 第二行:取引用的值 77

11.2.1 語句的執行者 77

11.2.2 執行期值的覆蓋與讀取 78

11.2.3 取引用值的具體方法 79

11.3 第 一行:從執行到取結果的基礎模式 80

11.4 在ECMAScript中如何理解值1 80

11.5 小結 81

第三篇 從原型到類:向應用編程語言的進化

第 12章 詳解屬性及其性質 84

12.1 JavaScript 1.0~1.3中的對象 85

12.1.1 面向對象的基礎設計與實現 85

12.1.2 屬性存取及其可見性問題 86

12.2 自有屬性與從原型中繼承來的屬性 87

12.3 字面量、標識符與屬性 88

12.4 屬性存取的不確定性 88

12.5 小結 89

第 13章 從構造器到類:創建對象的方法 90

13.1 JavaScript支持繼承的歷史 91

13.1.1 基於對象的JavaScript 91

13.1.2 類與構造器 91

13.1.3 ES6之後的類 92

13.1.4 總結 93

13.2 兩種創建對象this的順序 94

13.3 改變對象創建的結果 95

13.4 小結 96

第 14章 從無到有:訪問父類的能力 97

14.1 面向對象早期設計中的概念抽象 98

14.2 為什麽要有super 98

14.3 super指向什麽 99

14.4 調用父類方法super.xxx() 100

14.4.1 super.xxx()中的this值 100

14.4.2 super()中的父類構造方法 101

14.4.3 構造方法在設計時面臨的選擇 102

14.5 訪問父類屬性super.xxx 102

14.6 小結 103

第 15章 實現用戶自定義的構建過程 105

15.1 自定義構建過程的必要性 106

15.1.1 關於隱式的構造方法 106

15.1.2 非派生類不用調用super() 107

15.2 定製的構造方法 108

15.3 定製構造器能返回任意對象 109

15.4 小結 109

第 16章 數據結構視角下的對象本質 111

16.1 對象的前世今生 112

16.2 兩種數據結構 113

16.3 結構的反面:解構 114

16.4 對象將兩種數據結構合而為一 115

16.5 小結 117

第 17章 原子層級上的對象與行為 118

17.1 null值 119

17.2 Null類型 120

17.3 null是所有原子對象的父類實例 121

17.4 從繼承性的角度觀察原子對象 122

17.4.1 派生自原子的類 122

17.4.2 一般函數/構造器 123

17.5 原子行為 124

17.6 小結 124

第四篇 從粗通到精通的進階之路:唯一不變的是變化本身

第 18章 原始值:類型系統運算的終極目標 126

18.1 類型系統的簡化 127

18.1.1 從值到對象的類型轉換 127

18.1.2 對象可以轉換成哪些值 127

18.1.3 值與值之間的轉換 129

18.2 問題:將數組和對象相加會發生什麽 130

18.3 分析:隱式轉換中的意圖推斷和轉換過程 131

18.3.1 返回值本身 131

18.3.2 返回內部槽中的原始值 132

18.3.3 作為原始值處理 132

18.3.4 使用傳統的類型轉換邏輯 133

18.4 解題 133

18.4.1 從對象到原始值的轉換 133

18.4.2 加號運算符的特殊性 134

18.4.3 字符串在加號運算符中的優先權 134

18.4.4 預期情況與非預期情況下的處理 135

18.5 Date特例的進一步分析 136

18.6 小結 137

第 19章 JavaScript實現動態執行時的基礎設施 138

19.1 eval執行對傳入參數的理解 139

19.2 eval執行對環境的要求 139

19.2.1 環境 140

19.2.2 執行上下文 140

19.2.3 管理 141

19.2.4 不用於執行的環境 142

19.2.5 eval()的環境 143

19.3 特殊的非嚴格模式的全局 144

19.4 小結 145

第 20章 非嚴格模式的全局環境中的動態執行 146

20.1 在全局環境中的eval 147

20.2 名字之爭:對eval安全性的權衡 148

20.3 嚴格模式是執行限制而不是環境屬性 149

20.4 直接調用與間接調用的對比 150

20.5 為什麽本章標題下的代碼是間接調用 151

20.6 eval()怎麽返回結果 153

20.7 小結 154

第 21章 動態函數及其工作原理 155

21.1 動態創建函數的方法 156

21.1.1 得到函數的幾種途徑 156

21.1.2 幾種動態函數的構造器 157

21.1.3 函數的3個組件 157

21.1.4 動態函數的創建過程 158

21.2 動態函數與其他函數的一致性 159

21.3 動態創建函數與間接調用eval()的唯一差異 159

21.4 小結 160

第五篇 從有序中抽離時間:並行的本質不是有序而是重復

第 22章 Promise的精華:then鏈 162

22.1 早期JavaScript中的並行邏輯 163

22.2 從回調到Promise的then鏈 164

22.2.1 then鏈與其他主要概念之間的關系 164

22.2.2 並生體:從then鏈的本質來理解時間剝離 165

22.3 then鏈的起始端:resolve()/reject()置值器 166

22.4 通過then鏈交付數據 168

22.4.1 p.then(f)中f的傳入值 168

22.4.2 p.then(f)中f的返回值 169

22.5 小結 170

第 23章 then鏈中的異數:Thenable對象與類型模糊 171

23.1 Thenable是行為化的Promise 172

23.1.1 Thenable是通過特定界面向外界陳述自身值的對象 172

23.1.2 then方法需要有執行回調的潛在能力 173

23.2 Thenable值的可變性及其影響 174

23.3 Thenable中then()的返回值 176

23.4 then()的主動喚起與被動喚起 177

23.5 Thenable的概念轉換與類型模糊 177

23.6 小結 178

第 24章 Promise類與子類 180

24.1 Promise類的應用:以“Hello world”程序為例 181

24.1.1 用三元組替代Promise的行為 181

24.1.2 執行器中的其他邏輯 182

24.2 類上的原型方法:以異常處理為例 182

24.3 子類及其構造方法的界面 184

24.3.1 定製執行器邏輯及其返回 184

24.3.2 定製構造方法的界面 185

24.4 小結 186

第 25章 精巧的設計:await/async 187

25.1 異步函數與異步上下文 188

25.1.1 異步上下文的獨特之處 188

25.1.2 異步在多次調用的不同表現 189

25.2 await上演的帽子魔法 190

25.2.1 執行棧上的細節變化 190

25.2.2 處理數據x的詳細邏輯 191

25.3 async/await以及yield等特殊的名字 193

25.4 小結 195

第 26章 並發與多線程 196

26.1 ECMAScript中的線程並發模型 197

26.1.1 多線程並發執行環境 197

26.1.2 資源爭用:並發執行的核心沖突 198

26.2 工作線程及其調度 198

26.2.1 通知與數據交換 201

26.2.2 游離狀態與調度模型 201

26.2.3 現實環境 201

26.3 持鎖訪問 202

26.3.1 Atomics.wait()的細節 205

26.3.2 lock()方法的使用以及它存在的問題 206

26.3.3 資源規劃、競爭與死鎖 208

26.4 小結 210

第 27章 並發在分佈式環境中的應用 211

27.1 從無視時間到管理時間 211

27.2 靜態規劃的本質是假設系統不受時間流逝的影響 212

27.2.1 需要基於一個可通信網絡 213

27.2.2 需要檢測資源狀態 214

27.2.3 需要帶預備過程的兩階段提交 215

27.2.4 用一對完整的“請求/響應”來獲取資源 215

27.3 游離狀態在分佈式系統中的問題 216

27.4 去中心化與分佈式模型 217

27.5 小結 218

第六篇 致未來:新的語言特性

第 28章 動靜之間的平衡:import() 220

28.1 ES6模塊的主要問題 221

28.1.1 瀏覽器端的特殊性 221

28.1.2 服務器端的簡單需求 222

28.1.3 ES6規範的選擇 224

28.2 動態導入的模塊 224

28.2.1 語法查錯 225

28.2.2 決定時效性 226

28.3 import()的出現 226

28.4 瀏覽器生態下的動態導入 227

28.5 受ESM模塊影響的網頁腳本執行順序 231

28.6 小結 232

第 29章 所有的組合:Promise.allSettled()和Promise.any() 233

29.1 組合的基本原則 234

29.1.1 通過組合來擴展系統的外延 234

29.1.2 尋求合理的補充 235

29.1.3 少即是多的理念 238

29.2 更多組合、更多選擇 239

29.3 小結 241

第30章 與null的長期鬥爭:從 .到 242

30.1 使用null和undefined的一些最佳實踐 243

30.2 空值檢測的一些預期性質 245

30.3 問號的設計 246

30.3.1 短路運算與 .運算符的短路設計 246

30.3.2 是否存在一種新的語法設計風格 248

30.3.3 JavaScript運算符在設計上的限制 251

30.4 小結 252

第31章 塊的魔法:類強化過程中的那些方案 254

31.1 代碼的組織:形式分塊 255

31.1.1 信息隱蔽 255

31.1.2 結構化 256

31.1.3 映射 256

31.1.4 在JavaScript中代碼分塊與作用域的關系 257

31.2 表達式級別的詞法作用域 257

31.3 圍繞類或對象的信息隱蔽進行的設計 260

31.3.1 字段:TC39對信息隱蔽的理解 261

31.3.2 塊:類構造與實例構造過程的組織與聯系 264

31.3.3 類的進一步強化:塊化和註解化 266

31.4 有關作用域的兩點補充設計 268

31.5 小結 269

第32章 計算與應用:數據類型設計上的強化或概念擴展 271

32.1 JavaScript的內建數據類型與標準庫 273

32.1.1 對象與標準庫 273

32.1.2 標準庫的結構 273

32.1.3 強化標準庫的進展 274

32.2 在基礎類型中對有序類型的進一步設計 275

32.3 在內存與線程相關技術中對應用環境的更多考量 278

32.4 宿主行為規範 280

32.5 小結 283

第33章 最後的屏障:頂層await 285

33.1 模塊的狀態 286

33.2 模塊的頂層代碼 287

33.3 模塊頂層代碼中的await 288

33.4 瀏覽器環境下的異步 290

33.5 最後一塊落井石 291

33.6 小結 294

附錄A 22道測試題 295

附錄B 測試題答案及解析 299