深入理解JavaScript

《深入理解JavaScript》是2016年人民郵電出版社出版的圖書,作者是[美] 羅徹麥爾 ( AxelRauschmayer )。

基本信息

【作者】[美]羅徹麥爾(AxelRauschmayer)【編輯】陳冀康
【ISBN】978-7-115-40260-8【日期】2016-01
【版次】1【印次】1
【頁數】413頁【字數】516千字
【開本】16【定價】79元

圖書簡介

JavaScript是目前Web開發領域非常流行的一種程式語言,得到眾多IT從業人員和編程愛好者的關注。
本書是一本全面、深入介紹JavaScript語言的學習指南。本書共分四個部分,第1部分幫助讀者快速入手,掌握基本的JavaScript編程要點;第2部分介紹JavaScript的發展和技術背景;第3部分深入探索JavaScript,介紹了語法、值、運算符、布爾類型、數字、字元串、語句、異常捕獲、函式、變數、對象與繼承、數組、正則表達式、Date、Math、JSON、標準全局變數、編碼和JavaScript、ECMAScript 5的新特性等內容;第4部分介紹技巧、工具和類庫,幫助讀者更好地運用JavaScript進行編程。

目錄

第1部分 JavaScript快速上手

第1章 基礎JavaScript 3

1.1 背景 3

1.1.1 JavaScript與ECMAScript 3

1.1.2 JavaScript的影響和本質 3

1.2 語法 4

1.2.1 語法概述 4

1.2.2 語句和表達式 5

1.2.3 分號 5

1.2.4 注釋 6

1.3 變數和賦值 6

1.3.1 賦值 6

1.3.2 複合賦值運算符 6

1.3.3 標識符與變數名 6

1.4 值 7

1.4.1 原始值和對象 8

1.4.2 原始值 9

1.4.3 對象 9

1.4.4 undefined和null 10

1.4.5 使用typeof和instanceof對值分類 11

1.5 布爾值 13

1.5.1 真值與假值 13

1.5.2 二元邏輯運算符 14

1.5.3 等式運算符 14

1.6 數字 14

1.7 運算符 15

1.8 字元串 16

1.8.1 字元串運算符 16

1.8.2 字元串方法 17

1.9 語句 17

1.9.1 條件語句 17

1.9.2 循環語句 18

1.10 函式 19

1.10.1 函式聲明的提升特性 19

1.10.2 特殊的變數arguments 20

1.10.3 參數太多或太少 20

1.10.4 可選參數 20

1.10.5 強制參數長度 21

1.10.6 將arguments轉換為數組 21

1.11 異常捕獲 21

1.12 嚴格模式 22

1.13 變數作用域和閉包 22

1.13.1 變數是函式作用域的 23

1.13.2 變數的提升特性 23

1.13.3 閉包 23

1.13.4 IIFE模式:引入一個新的作用域 24

1.14 對象和構造函式 25

1.14.1 單一對象 25

1.14.2 任意屬性名 26

1.14.3 提取方法 26

1.14.4 方法中的函式 27

1.14.5 構造函式:對象工廠 28

1.15 數組 29

1.15.1 數組字面量 29

1.15.2 數組方法 30

1.15.3 遍歷數組 30

1.16 正則表達式 31

1.16.1 test()方法:匹配嗎 31

1.16.2 exec()方法:匹配以及捕獲分組 31

1.16.3 replace()方法:搜尋和替換 31

1.17 Math 32

1.18 標準庫的其他功能 32

第2部分 背景

第2章 為什麼選擇JavaScript 35

2.1 JavaScript可以自由使用嗎 35

2.2 JavaScript優雅嗎 36

2.3 JavaScript有用嗎 36

2.3.1 圖形用戶界面 36

2.3.2 其他技術補充完善JavaScript 36

2.4 JavaScript有什麼好用的工具嗎 37

2.5 JavaScript是否足夠快 37

2.6 JavaScript是廣泛使用的嗎 38

2.7 JavaScript有前途嗎 38

2.8 結論 38

第3章 JavaScript的性質 39

3.1 古怪和非官方特性 40

3.2 優雅部分 40

3.3 影響 41

第4章 JavaScript是如何創造出來的 42

第5章 標準化:ECMAScript 44

第6章 JavaScript的歷史裡程碑 46

第3部分 深入JavaScript

第7章 JavaScript的語法 53

7.1 語法概覽 53

7.2 注釋 54

7.3 表達式與語句 54

7.3.1 表達式 55

7.3.2 語句 55

7.4 控制流語句和塊 57

7.5 使用分號的規則 57

7.5.1 以塊結束的語句後面沒有分號 58

7.5.2 空語句 58

7.5.3 自動分號插入 59

7.6 合法標識符 60

7.7 數字字面量的方法調用 62

7.8 嚴格模式 62

7.8.1 啟用嚴格模式 62

7.8.2 嚴格模式:建議與注意事項 63

7.8.3 嚴格模式中,變數必須被聲明 63

7.8.4 嚴格模式下的函式 63

7.8.5 嚴格模式中,設定或者刪除不可改變的屬性會拋出異常 65

7.8.6 嚴格模式中的不合格標識符不能刪除 65

7.8.7 嚴格模式中,eval更加簡潔 66

7.8.8 嚴格模式中禁用的特性 66

第8章 值 67

8.1 JavaScript中的類型體系 67

8.1.1 JavaScript類型 67

8.1.2 靜態與動態 68

8.1.3 靜態類型與動態類型 68

8.1.4 靜態類型檢查和動態類型檢查 68

8.1.5 強制轉換 69

8.2 原始值和對象 69

8.2.1 原始值 70

8.2.2 對象 70

8.3 undefined和null 72

8.3.1 undefined和null的出現場景 72

8.3.2 檢測undefined和null 73

8.3.3 undefined和null的歷史 74

8.3.4 修改undefined 75

8.4 原始值的包裝對象 76

8.4.1 包裝對象不同於原始值 76

8.4.2 原始值的包裝與去包裝 76

8.4.3 原始值從包裝器借調方法 77

8.5 強制類型轉換 78

8.5.1 強制類型轉換會隱藏bug 78

8.5.2 轉換成布爾值、數字、字元串和對象的函式 78

8.5.3 算法:ToPrimitive()—將值轉換為原始值 80

第9章 運算符 82

9.1 運算符和對象 82

9.2 賦值運算符 82

9.3 等號運算符:=== 和 == 84

9.3.1 嚴格相等(===,!==) 84

9.3.2 普通(寬鬆)相等(==,!=) 85

9.3.3 沒有針對==的有效用例 87

9.4 排序運算符 88

9.5 加號運算符(+) 89

9.6 布爾運算符和數字運算符 90

9.7 特殊運算符 90

9.7.1 條件運算符(?:) 90

9.7.2 逗號運算符 91

9.7.3 void運算符 91

9.8 通過typeof和instanceof判斷值類型 93

9.8.1 typeof:判斷原始值 93

9.8.2 instanceof:檢測對象是否是給定構造函式的實例 95

9.9 對象運算符 96

第10章 布爾類型 97

10.1 轉換成布爾值 97

10.1.1 手動轉換為布爾值 97

10.1.2 真值和假值 98

10.2 邏輯運算符 99

10.2.1 二元邏輯運算符:與(&&)和或(||) 99

10.2.2 邏輯與(&&) 100

10.2.3 邏輯或(||) 100

10.2.4 邏輯非(!) 101

10.3 等號運算符、排序運算符 101

10.4 Boolean函式 102

第11章 數字 103

11.1 數字字面量 103

11.1.1 說明 103

11.1.2 在字面量上調用方法 104

11.2 轉換成數字 104

11.2.1 手動轉換為數字 104

11.2.2 parseFloat() 105

11.3 特殊的數字值 106

11.3.1 NaN 106

11.3.2 Infinity 108

11.3.3 兩個0 109

11.4 數字的內部表示 111

11.5 處理捨入錯誤 112

11.6 JavaScript中的整型 114

11.6.1 整型的範圍 114

11.6.2 將整型表示為浮點數字 115

11.6.3 安全的整型 116

11.7 轉換成整數 117

11.7.1 通過Math.floor(),Math.ceil()和Math.round()得到整數 118

11.7.2 通過定製函式ToInteger()得到整數 119

11.7.3 通過位運算符得到32位整數 119

11.7.4 通過parseInt()得到整數 121

11.8 算術運算符 122

11.9 位運算符 125

11.9.1 背景知識 125

11.9.2 位運算非操作符 126

11.9.3 二進制位運算符 126

11.9.4 位運算移位操作符 127

11.10 Number函式 128

11.11 Number構造器屬性 128

11.12 Number原型方法 129

11.12.1 Number.prototype.toFixed(fractionDigits?) 129

11.12.2 Number.prototype.toPrecision(precision?) 130

11.12.3 Number.prototype.toString(radix?) 130

11.12.4 Number.prototype.toExponential(fractionDigits?) 131

11.13 用於數字的函式 132

11.14 本章參考資料 132

第12章 字元串 133

12.1 字元串字面量 133

12.2 字元串字面量中的轉義字元 134

12.3 字元訪問 135

12.4 轉換為字元串 135

12.5 字元串比較 137

12.6 字元串拼接 137

12.6.1 合併:加號(+)運算符 137

12.6.2 合併:拼接字元串數組 138

12.7 字元串函式 138

12.8 字元串構造器方法 138

12.9 字元串length屬性 139

12.10 字元串原型方法 139

12.10.1 提取子字元串 139

12.10.2 字元串的變換 141

12.10.3 字元串的檢索和比較 142

12.10.4 支持正則表達式的方法 143

第13章 語句 145

13.1 聲明和變數賦值 145

13.2 循環語句和條件語句的主體 145

13.3 循環 146

13.3.1 循環的機制 146

13.3.2 while 147

13.3.3 do-while 147

13.3.4 for 147

13.3.5 for-in 148

13.3.6 for each-in 150

13.4 條件語句 150

13.4.1 if-then-else 150

13.4.2 switch 151

13.5 with語句 153

13.5.1 語法與語義 153

13.5.2 with語句已被廢棄 154

13.5.3 廢棄with的原因 154

13.6 debugger語句 156

第14章 異常捕獲 157

14.1 什麼是異常捕獲 157

14.2 JavaScript中的異常捕獲 158

14.2.1 throw 159

14.2.2 try-catch-finally 159

14.2.3 例子 160

14.3 Error構造器 161

14.4 棧跟蹤 162

14.5 實現一個自己的異常構造器 163

第15章 函式 164

15.1 JavaScript中函式的3種形式 164

15.2 術語:“形參”和“實參” 165

15.3 定義函式 165

15.3.1 函式表達式 166

15.3.2 函式聲明 167

15.3.3 Function構造器 167

15.4 函式提升 167

15.5 函式的名稱 168

15.6 哪個更好,函式聲明還是函式表達式 168

15.7 控制函式調用:call(),apply()和bind() 169

15.7.1 func.apply(thisValue, argArray) 169

15.7.2 func.bind(thisValue, arg1, ..., argN) 170

15.8 參數缺失或者超出時的處理 170

15.8.1 通過索引訪問所有參數:神奇的arguments變數 170

15.8.2 強制性參數,限制參數數量的最小值 172

15.8.3 可選參數 173

15.8.4 模擬參數的引用傳遞 173

15.8.5 陷阱:非預期的可選參數 174

15.9 具名參數 175

15.9.1 具名參數可作為描述信息 175

15.9.2 可選的具名參數 176

15.9.3 在JavaScript中模擬具名參數 176

第16章 變數:作用域、環境和閉包 177

16.1 定義變數 177

16.2 背景知識:靜態性和動態性 177

16.3 背景知識:變數的作用域 178

16.4 變數以函式為作用域 179

16.5 變數聲明的提前 180

16.6 通過IIFE引入新的作用域 181

16.6.1 IIFE變體:前綴運算符 182

16.6.2 IIFE變體:預內置表達式上下文 183

16.6.3 IIFE變體:傳參的IIFE 183

16.6.4 IIFE的套用 183

16.7 全局變數 184

16.7.1 最佳實踐:避免創建全局變數 184

16.7.2 模組系統可以減少全局變數的引入 185

16.8 全局對象 185

16.8.1 跨平台兼容 186

16.8.2 window的使用場景 186

16.9 環境:變數的管理 188

16.10 閉包:使得函式可以維持其創建時所在的作用域 191

16.10.1 通過環境來控制閉包 191

16.10.2 陷阱:不經意間的環境共用 193

第17章 對象與繼承 195

17.1 第1層:單一對象 195

17.1.1 屬性的種類 195

17.1.2 對象字面量 196

17.1.3 點運算符(.):通過固定鍵值訪問屬性 197

17.1.4 特殊的屬性鍵 199

17.1.5 中括弧操作符([]):通過計算出的鍵訪問屬性 199

17.2 把任意值轉化為對象 201

17.3 this作為函式和方法的隱式參數 202

17.3.1 在調用函式時設定 this:call(),apply()和bind() 202

17.3.2 “用於構造函式的 apply()”詳細闡述了如何配合構造函式

使用apply() 203

17.3.3 用於構造函式的apply() 204

17.3.4 缺陷:提取方法時丟失 this 206

17.3.5 缺陷:方法中的函式會掩蓋 this 207

17.4 第2層:對象間的原型關係 209

17.4.1 繼承 209

17.4.2 覆寫 210

17.4.3 通過原型在對象間共享數據 210

17.4.4 獲取和設定原型 211

17.4.5 特殊屬性 __proto__ 213

17.4.6 設定和刪除僅影響自有屬性 214

17.5 遍歷和檢測屬性 215

17.5.1 列出自有的屬性鍵 215

17.5.2 列出所有的屬性鍵 216

17.5.3 檢測屬性是否存在 216

17.5.4 示例 217

17.6 最佳實踐:遍歷自有屬性 218

17.7 訪問器(getter 和 setter) 218

17.7.1 通過對象字面量定義訪問器 219

17.7.2 通過屬性描述符定義訪問器 219

17.7.3 訪問器和繼承 219

17.8 屬性特性和屬性描述符 220

17.8.1 屬性特性 220

17.8.2 屬性描述符 221

17.8.3 通過描述符獲取和定義屬性 221

17.8.4 複製對象 223

17.8.5 屬性:定義與賦值 224

17.8.6 繼承的唯讀屬性不能被賦值 225

17.8.7 枚舉性:最佳實踐 225

17.9 保護對象 226

17.9.1 防止擴展 226

17.9.2 封閉 227

17.9.3 凍結 228

17.9.4 缺陷:保護是淺層的 229

17.10 第3層:構造函式—實例工廠 229

17.10.1 JavaScript 中 new 操作符的實現 231

17.10.2 術語:兩個原型 231

17.10.3 實例的 constructor 屬性 232

17.10.4 instanceof 運算符 234

17.10.5 實現構造函式的小技巧 237

17.11 原型屬性中的數據 238

17.11.1 對於實例屬性,避免使用帶初始值的原型屬性 238

17.11.2 避免非多態的原型屬性 240

17.11.3 多態的原型屬性 241

17.12 保持數據私有性 241

17.12.1 構造函式環境中的私有數據(Crockford私有模式) 241

17.12.2 使用標記的鍵的屬性保存私有數據 245

17.12.3 使用具體化鍵的屬性保存私有數據 246

17.12.4 通過IIFE保持全局數據私有 247

17.13 第4層:構造函式之間的繼承 248

17.13.1 繼承實例屬性 249

17.13.2 繼承原型屬性 249

17.13.3 確保instanceof正常工作 250

17.13.4 覆寫方法 251

17.13.5 父調用 251

17.13.6 避免硬編碼父構造函式的名字 252

17.13.7 示例:構造函式繼承 253

17.13.8 示例:內建構造函式的繼承層次結構 254

17.13.9 反模式:原型是父構造函式的實例 254

17.14 所有對象的方法 254

17.14.1 轉換為原始值 254

17.14.2 Object.prototype.toLocaleString() 255

17.14.3 原型式繼承和屬性 255

17.15 泛型方法:借用原型方法 256

17.15.1 通過字面量訪問Object.prototype和Array.prototype 257

17.15.2 調用泛型方法的例子 258

17.15.3 類似數組的對象和泛型方法 259

17.15.4 所有泛型方法列表 261

17.16 缺陷:Object作為Map使用 263

17.16.1 缺陷1:繼承影響讀取屬性 263

17.16.2 缺陷2:覆寫會影響調用方法 265

17.16.3 缺陷3:特殊屬性__proto__ 265

17.16.4 字典模式:沒有原型的對象更適合用作映射 266

17.16.5 最佳實踐 267

17.17 備忘錄:對象的使用 267

第18章 數組 269

18.1 概述 269

18.1.1 數組是映射,不是元組 270

18.1.2 數組也可以具有屬性 270

18.2 創建數組 270

18.2.1 數組構造函式 271

18.2.2 多維數組 271

18.3 數組索引 272

18.3.1 操作符in與索引 273

18.3.2 刪除數組元素 273

18.3.3 數組索引的細節 273

18.4 長度 275

18.4.1 手動增加數組的長度 275

18.4.2 減少數組的長度 276

18.4.3 最大長度 277

18.5 數組中的“空缺” 277

18.5.1 創建空缺 278

18.5.2 稀疏數組和密集數組 278

18.5.3 哪些操作會忽略空缺,而哪些不會 279

18.5.4 移除數組中的空缺 280

18.6 數組構造函式 281

18.7 數組原型方法 281

18.8 添加和刪除元素(破壞性地) 281

18.9 排序和顛倒元素順序(破壞性地) 283

18.9.1 比較數字 284

18.9.2 比較字元串 284

18.9.3 比較對象 284

18.10 合併、切分和連線(非破壞性地) 285

18.11 值的查找(非破壞性地) 286

18.12 疊代(非破壞性地) 287

18.12.1 檢測方法 287

18.12.2 轉化方法 289

18.12.3 歸約函式 289

18.13 缺陷:類數組對象 291

18.14 最佳實踐:遍歷數組 291

第19章 正則表達式 293

19.1 正則表達式語法 293

19.1.1 原子:常規 293

19.1.2 原子:字元類 295

19.1.3 原子:分組 296

19.1.4 量詞 296

19.1.5 斷言 297

19.1.6 析取(或) 298

19.2 Unicode 和正則表達式 298

19.3 創建正則表達式 298

19.3.1 字面量與構造函式 299

19.3.2 標識 299

19.3.3 正則表達式的實例屬性 299

19.3.4 幾個創建正則表達式的例子 300

19.4 RegExp.prototype.test:是否存在匹配 300

19.5 String.prototype.search:匹配位置的索引 301

19.6 RegExp.prototype.exec:捕獲分組 301

19.6.1 首次匹配(不設定標識/g) 302

19.6.2 全部匹配(設定標識 /g) 302

19.7 String.prototype.match:捕獲分組或返回所有匹配的子字元串 303

19.8 String.prototype.replace:查找和替換 303

19.8.1 Replacement 為字元串的情況 304

19.8.2 當Replacement為函式時 305

19.9 標識 /g 的一些問題 305

19.10 提示與技巧 308

19.10.1 引用文本 308

19.10.2 陷阱:缺少斷言(例如^、$)的正則表達式可以在任意位置

匹配 308

19.10.3 匹配一切或什麼都不匹配 308

19.10.4 手動實現逆向查找 309

19.11 正則表達式備忘單 310

第20章 Date 313

20.1 Date構造函式 313

20.2 Date構造函式方法 315

20.3 Date原型方法 315

20.3.1 時間單位的getter和setter方法 316

20.3.2 各種各樣的getter和setter方法 317

20.3.3 將日期轉換成字元串 317

20.4 日期和時間格式 319

20.4.1 日期格式(無時間) 319

20.4.2 時間格式(無日期) 320

20.4.3 日期時間格式 321

20.5 時間值:從1970-01-01開始的毫秒數 321

第21章 Math 323

21.1 Math屬性 323

21.2 數值函式 324

21.3 三角函式 325

21.4 其他函式 327

第22章 JSON 329

22.1 背景 329

22.1.1 數據格式 329

22.1.2 歷史 330

22.1.3 語法 330

22.2 JSON.stringify(value, replacer?, space?) 334

22.2.1 被JSON.stringify()忽略的數據 335

22.2.2 toJSON()方法 336

22.3 JSON.parse(text, reviver?) 337

22.4 通過節點訪問函式轉換數據 338

22.4.1 JSON.stringify() 339

22.4.2 JSON.parse() 339

第23章 標準全局變數 341

23.1 構造器 341

23.2 Error構造器 342

23.3 非構造器函式 342

23.3.1 文字的編碼和解碼 342

23.3.2 數值歸類與數值轉換 343

23.4 通過eval()和new Function()來動態執行JavaScript代碼 344

23.4.1 使用eval()執行代碼 344

23.4.2 通過new Function()執行代碼 346

23.4.3 eval()與new Function()比較 347

23.4.4 最佳實踐 347

23.4.5 結論 347

23.5 Console API 348

23.5.1 Console API在各引擎的標準程度如何 348

23.5.2 簡單的日誌記錄 349

23.5.3 檢查和計數 350

23.5.4 格式化的日誌 350

23.5.5 性能和時間 352

23.6 名稱空間和特殊值 353

第24章 編碼和JavaScript 354

24.1 Unicode歷史 354

24.2 Unicode中的重要概念 354

24.3 碼位 356

24.4 Unicode編碼 357

24.5 JavaScript源碼和Unicode 359

24.5.1 內部源碼轉化 359

24.5.2 源碼外部轉化 359

24.6 JavaScript字元串和Unicode 361

24.6.1 轉義序列 361

24.6.2 通過轉義引用星際平面的字元 361

24.6.3 字元長度計算 362

24.6.4 Unicode正常化 362

24.7 JavaScript正則表達式和Unicode 363

24.7.1 匹配任意的碼元以及任意的碼位 364

24.7.2 庫 364

24.7.3 推薦閱讀的章節資源 364

第25章 ECMAScript 5的新特性 366

25.1 新特性 366

25.2 語法的改變 367

25.3 標準庫的新功能 367

25.3.1 元編程 367

25.3.2 新方法 368

25.3.3 JSON 369

25.4 兼容舊瀏覽器的小貼士 370

第4部分 技巧、工具和類庫

第26章 元編程風格指南 373

26.1 現有風格指南 373

26.2 通用技巧 374

26.2.1 代碼應該具有一致性 374

26.2.2 代碼應該易於理解 374

26.3 普遍認可的最佳實踐 375

26.3.1 括弧風格 376

26.3.2 推薦字面量而不是構造函式 377

26.3.3 不要自作聰明 378

26.3.4 可接受的技巧 379

26.4 具有爭議的規則 380

26.4.1 語法 380

26.4.2 變數 381

26.4.3 面向對象 382

26.4.4 其他 383

26.5 結論 384

第27章 調試的語言機制 385

第28章 子類化內置構造函式 386

28.1 術語 386

28.2 障礙1:具有內部屬性的實例 386

28.2.1 障礙1的解決方法 388

28.2.2 注意 389

28.3 障礙2:內置的構造函式不能作為方法調用 389

28.4 另一種解決方案:委託 390

第29章 JSDoc:生成API文檔 392

29.1 JSDoc基礎 393

29.1.1 語法 393

29.1.2 命名類型 394

29.2 基礎的標籤 395

29.3 文檔記錄函式和方法 396

29.4 行內類型信息(“行內文檔注釋”) 397

29.5 文檔記錄變數、參數和實例屬性 397

29.6 文檔記錄類 398

29.6.1 通過構造函式定義類 399

29.6.2 通過對象字面量定義類 399

29.6.3 通過帶有@constructs方法的對象字面量定義類 400

29.6.4 子類 400

29.7 其他有用的標籤 401

第30章 類庫 402

30.1 shim和polyfill 402

30.2 四個語言類庫 403

30.3 ECMAScript的國際化API 403

30.3.1 ECMAScript的國際化API,第1版 403

30.3.2 它是怎么樣的標準呢 404

30.3.3 我們可以用它做什麼 404

30.3.4 延伸閱讀 404

30.4 JavaScript資源目錄 405

第31章 模組系統和包管理器 407

31.1 模組系統 407

31.2 包管理器 408

31.3 簡單粗暴的模組實現 408

第32章 其他工具 410

第33章 接下來該做什麼 412

相關詞條

相關搜尋

熱門詞條

聯絡我們