JavaScript這門語(yǔ)言簡(jiǎn)單易用,很容易上手,但其語(yǔ)言機(jī)制復(fù)雜微妙,即使是經(jīng)驗(yàn)豐富的JavaScript開發(fā)人員,如果沒(méi)有認(rèn)真學(xué)習(xí)的話也無(wú)法真正理解。本套書直面當(dāng)前JavaScript開發(fā)人員不求甚解的大趨勢(shì),深入理解語(yǔ)言內(nèi)部的機(jī)制,全面介紹了JavaScript中常被人誤解和忽視的重要知識(shí)點(diǎn)。本書是其中卷,主要介紹了類型、語(yǔ)法、異步和性能。
JavaScript語(yǔ)言有很多復(fù)雜的概念,但卻用簡(jiǎn)單的方式體現(xiàn)出來(lái)(比如回調(diào)函數(shù)),因此,JavaScript開發(fā)者無(wú)需理解語(yǔ)言內(nèi)部的原理,就能編寫出功能全面的程序。然而,JavaScript的這些復(fù)雜精妙的概念才是語(yǔ)言的精髓,即使是經(jīng)驗(yàn)豐富的JavaScript開發(fā)者,如果沒(méi)有認(rèn)真學(xué)習(xí),也無(wú)法真正理解語(yǔ)言本身的特性。正是因?yàn)榻^大多數(shù)人不求甚解,一遇到出乎意料的行為就認(rèn)為是語(yǔ)言本身有缺陷,進(jìn)而把相關(guān)的特性加入黑名單,久而久之就排除了這門語(yǔ)言的多樣性,人為地使它變得不完整、不安全。
“你不知道的JavaScript”系列就是要讓不求甚解的JavaScript開發(fā)者迎難而上,深入語(yǔ)言內(nèi)部,弄清楚JavaScript每一個(gè)零部件的用途。本書介紹了該系列的兩個(gè)主題:“類型和語(yǔ)法”以及“異步和性能”。掌握了這些知識(shí)之后,無(wú)論什么技術(shù)、框架和流行詞語(yǔ),你都能輕松理解。
目錄
前言 XI
第一部分 類型和語(yǔ)法
序 2
第1 章 類型 3
1.1 類型 4
1.2 內(nèi)置類型 4
1.3 值和類型 6
1.3.1 undefined 和undeclared 6
1.3.2 typeof Undeclared 7
1.4 小結(jié) 10
第2 章 值 11
2.1 數(shù)組 11
2.2 字符串 13
2.3 數(shù)字 15
2.3.1 數(shù)字的語(yǔ)法 16
2.3.2 較小的數(shù)值 18
2.3.3 整數(shù)的安全范圍 19
2.3.4 整數(shù)檢測(cè) 20
2.3.5 32 位有符號(hào)整數(shù) 20
2.4 特殊數(shù)值 21
2.4.1 不是值的值 21
2.4.2 undefined 21
2.4.3 特殊的數(shù)字 23
2.4.4 特殊等式 27
2.5 值和引用 28
2.6 小結(jié) 31
第3 章 原生函數(shù) 33
3.1 內(nèi)部屬性[[Class]] 34
3.2 封裝對(duì)象包裝 35
3.3 拆封 36
3.4 原生函數(shù)作為構(gòu)造函數(shù) 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 小結(jié) 45
第4 章 強(qiáng)制類型轉(zhuǎn)換 46
4.1 值類型轉(zhuǎn)換 46
4.2 抽象值操作 47
4.2.1 ToString 48
4.2.2 ToNumber 52
4.2.3 ToBoolean 53
4.3 顯式強(qiáng)制類型轉(zhuǎn)換 56
4.3.1 字符串和數(shù)字之間的顯式轉(zhuǎn)換 57
4.3.2 顯式解析數(shù)字字符串 62
4.3.3 顯式轉(zhuǎn)換為布爾值 65
4.4 隱式強(qiáng)制類型轉(zhuǎn)換 67
4.4.1 隱式地簡(jiǎn)化 67
4.4.2 字符串和數(shù)字之間的隱式強(qiáng)制類型轉(zhuǎn)換 68
4.4.3 布爾值到數(shù)字的隱式強(qiáng)制類型轉(zhuǎn)換 71
4.4.4 隱式強(qiáng)制類型轉(zhuǎn)換為布爾值 72
4.4.5 || 和 73
4.4.6 符號(hào)的強(qiáng)制類型轉(zhuǎn)換 76
4.5 寬松相等和嚴(yán)格相等 77
4.5.1 相等比較操作的性能 .77
4.5.2 抽象相等
4.6 抽象關(guān)系比較 89
4.7 小結(jié) 91
第5 章 語(yǔ)法 92
5.1 語(yǔ)句和表達(dá)式 92
5.1.1 語(yǔ)句的結(jié)果值 93
5.1.2 表達(dá)式的副作用 95
5.1.3 上下文規(guī)則 99
5.2 運(yùn)算符優(yōu)先級(jí) 104
5.2.1 短路 107
5.2.2 更強(qiáng)的綁定 107
5.2.3 關(guān)聯(lián) 108
5.2.4 釋疑 110
5.3 自動(dòng)分號(hào) 111
5.4 錯(cuò)誤 113
5.5 函數(shù)參數(shù) 115
5.6 try..finally 117
5.7 switch 120
5.8 小結(jié) 122
附錄A 混合環(huán)境JavaScript 123
第二部分 異步和性能
序 136
第1 章 異步:現(xiàn)在與將來(lái) 138
1.1 分塊的程序 139
1.2 事件循環(huán) 141
1.3 并行線程 143
1.4 并發(fā) 148
1.4.1 非交互 150
1.4.2 交互 150
1.4.3 協(xié)作 154
1.5 任務(wù) 156
1.6 語(yǔ)句順序 157
1.7 小結(jié) 159
第2 章 回調(diào) 161
2.1 continuation 162
2.2 順序的大腦 163
2.2.1 執(zhí)行與計(jì)劃 164
2.2.2 嵌套回調(diào)與鏈?zhǔn)交卣{(diào) 165
2.3 信任問(wèn)題 169
2.3.1 五個(gè)回調(diào)的故事 170
2.3.2 不只是別人的代碼 171
2.4 省點(diǎn)回調(diào) 173
2.5 小結(jié) 176
第3 章 Promise 178
3.1 什么是Promise 179
3.1.1 未來(lái)值 179
3.1.2 完成事件 183
3.2 具有then 方法的鴨子類型 188
3.3 Promise 信任問(wèn)題 190
3.3.1 調(diào)用過(guò)早 190
3.3.2 調(diào)用過(guò)晚 191
3.3.3 回調(diào)未調(diào)用 192
3.3.4 調(diào)用次數(shù)過(guò)少或過(guò)多 193
3.3.5 未能傳遞參數(shù)/ 環(huán)境值 193
3.3.6 吞掉錯(cuò)誤或異!194
3.3.7 是可信任的Promise 嗎 195
3.3.8 建立信任 197
3.4 鏈?zhǔn)搅鳌?98
3.5 錯(cuò)誤處理 206
3.5.1 絕望的陷阱 208
3.5.2 處理未捕獲的情況 209
3.5.3 成功的坑 211
3.6 Promise 模式 212
3.6.1 Promise.a(chǎn)ll([ .. ]) 212
3.6.2 Promise.race([ .. ]) 213
3.6.3 all([ .. ]) 和race([ .. ]) 的變體 216
3.6.4 并發(fā)迭代 217
3.7 Promise API 概述 219
3.7.1 new Promise(..) 構(gòu)造器 219
3.7.2 Promise.resolve(..) 和Promise.reject(..) 219
3.7.3 then(..) 和catch(..) 220
3.7.4 Promise.a(chǎn)ll([ .. ]) 和Promise.race([ .. ]) 221
3.8 Promise 局限性 222
3.8.1 順序錯(cuò)誤處理 222
3.8.2 單一值 223
3.8.3 單決議 225
3.8.4 慣性 227
3.8.5 無(wú)法取消的Promise 230
3.8.6 Promise 性能 231
3.9 小結(jié) 233
第4 章 生成器 234
4.1 打破完整運(yùn)行 234
4.1.1 輸入和輸出 236
4.1.2 多個(gè)迭代器 239
4.2 生成器產(chǎn)生值 243
4.2.1 生產(chǎn)者與迭代器 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 并發(fā) 258
4.5 生成器委托 262
4.5.1 為什么用委托 264
4.5.2 消息委托 264
4.5.3 異步委托 268
4.5.4 遞歸委托 268
4.6 生成器并發(fā) 269
4.7 形實(shí)轉(zhuǎn)換程序 273
4.8 ES6 之前的生成器 279
4.8.1 手工變換 280
4.8.2 自動(dòng)轉(zhuǎn)換 284
4.9 小結(jié) 285
第5 章 程序性能 287
5.1 Web Worker 288
5.1.1 Worker 環(huán)境 290
5.1.2 數(shù)據(jù)傳遞 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 優(yōu)化 295
5.3.2 asm.js 模塊 296
5.4 小結(jié) 298
第6 章 性能測(cè)試與調(diào)優(yōu) 299
6.1 性能測(cè)試 99
6.1.1 重復(fù) 300
6.1.2 Benchmark.js 301
6.2 環(huán)境為王 303
6.3 jsPerf.com 305
6.4 寫好測(cè)試 309
6.5 微性能 309
6.5.1 不是所有的引擎都類似 312
6.5.2 大局 314
6.6 尾調(diào)用優(yōu)化 316
6.7 小結(jié) 318
附錄A asynquence 庫(kù) 319
附錄B 高級(jí)異步模式 339