JavaScript核心原理:規範、邏輯與設計
周愛民
- 出版商: 人民郵電
- 出版日期: 2024-09-01
- 定價: $599
- 售價: 8.5 折 $509
- 語言: 簡體中文
- 頁數: 304
- ISBN: 711560892X
- ISBN-13: 9787115608925
-
相關分類:
JavaScript
立即出貨
買這商品的人也買了...
-
$420$332 -
$360$284 -
$1,280$998 -
$550$429 -
$600$468 -
$680$537 -
$599$509 -
$534$507 -
$810$770 -
$520$390 -
$419$398 -
$654$621 -
$580$493 -
$880$695 -
$650$507 -
$680$537 -
$599$569 -
$580$435 -
$600$468 -
$860$645 -
$474$450 -
$560$442 -
$300$225 -
$780$616 -
$680$537
相關主題
商品描述
本書是一本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