JavaScript這門語(yǔ)言簡(jiǎn)單易用,很容易上手,但其語(yǔ)言機(jī)制復(fù)雜微妙,即使是經(jīng)驗(yàn)豐富的JavaScript開發(fā)人員,如果沒有認(rèn)真學(xué)習(xí)的話也無法真正理解。本套書直面當(dāng)前JavaScript開發(fā)人員不求甚解的大趨勢(shì),深入理解語(yǔ)言內(nèi)部的機(jī)制,全面介紹了JavaScript中常被人誤解和忽視的重要知識(shí)點(diǎn)。本書是其下卷,主要介紹了JavaScript入門知識(shí)和對(duì)ES6及未來發(fā)展趨勢(shì)的展望。
本書既適合JavaScript語(yǔ)言初學(xué)者了解其精髓,又適合經(jīng)驗(yàn)豐富的JavaScript開發(fā)人員深入學(xué)習(xí)。
JavaScript語(yǔ)言有很多復(fù)雜的概念,但卻用簡(jiǎn)單的方式體現(xiàn)出來(比如回調(diào)函數(shù)),因此,JavaScript開發(fā)人無需理解語(yǔ)言內(nèi)部的原理,就能編寫出功能全面的程序。然而,JavaScript的這些復(fù)雜精妙的概念才是語(yǔ)言的精髓,即使是經(jīng)驗(yàn)豐富的JavaScript開發(fā)人,如果沒有認(rèn)真學(xué)習(xí),也無法真正理解語(yǔ)言本身的特性。正是因?yàn)榻^大多數(shù)人不求甚解,一遇到出乎意料的行為就認(rèn)為是語(yǔ)言本身有缺陷,進(jìn)而把相關(guān)的特性加入黑名單,久而久之就排除了這門語(yǔ)言的多樣性,人為地使它變得不完整、不安全。
“你不知道的JavaScript”系列就是要讓不求甚解的JavaScript開發(fā)人迎難而上,深入語(yǔ)言內(nèi)部,弄清楚JavaScript每一個(gè)零部件的用途,輕松理解前端圈里出現(xiàn)的各種技術(shù)、框架和流行術(shù)語(yǔ)。本書介紹了該系統(tǒng)的兩個(gè)主題:“起步上路”以及“ES6及更新版本”。
Kyle Simpson,推崇開放的互聯(lián)網(wǎng),對(duì)JavaScript、HTML5、實(shí)時(shí)/端對(duì)端通信和Web性能有深入研究。他是技術(shù)書作家、技術(shù)培訓(xùn)師、講師和開源社區(qū)的活躍成員。
【譯者簡(jiǎn)介】
單業(yè),計(jì)算機(jī)專業(yè)碩士,軟件工程師,曾供職于多家軟件公司,從事軟件開發(fā)工作,現(xiàn)居于上海。譯有《你不知道的JavaScript(中卷)》。
前言 xi
致謝 xvii
第 一部分 起步上路
序 2
第 1 章 深入編程 4
1.1 代碼 4
1.2 表達(dá)式 5
1.3 實(shí)踐 6
1.3.1 輸出 7
1.3.2 輸入 8
1.4 運(yùn)算符 9
1.5 值與類型 11
1.6 代碼注釋 13
1.7 變量 14
1.8 塊 16
1.9 條件判斷 17
1.10 循環(huán) 18
1.11 函數(shù) 20
1.12 實(shí)踐 23
1.13 小結(jié) 25
第 2 章 深入JavaScript 26
2.1 值與類型 26
2.1.1 對(duì)象 28
2.1.2 內(nèi)置類型方法 30
2.1.3 值的比較 31
2.2 變量 35
2.3 條件判斷 37
2.4 嚴(yán)格模式 39
2.5 作為值的函數(shù) 40
2.5.1 立即調(diào)用函數(shù)表達(dá)式 41
2.5.2 閉包 42
2.6 this標(biāo)識(shí)符 44
2.7 原型 46
2.8 舊與新 47
2.8.1 polyfilling 47
2.8.2 transpiling 48
2.9 非JavaScript 49
2.10 小結(jié) 50
第 3 章 深入“你不知道的JavaScript”系列 51
3.1 作用域和閉包 51
3.2 this和對(duì)象原型 52
3.3 類型和語(yǔ)法 53
3.4 異步和性能 53
3.5 ES6及更新版本 54
3.6 小結(jié) 55
第 二部分 ES6及更新版本
序 58
第 1 章 ES?現(xiàn)在與未來 59
1.1 版本 60
1.2 transpiling 61
1.3 小結(jié) 63
第 2 章 語(yǔ)法 64
2.1 塊作用域聲明 64
2.1.1 let聲明 65
2.1.2 const聲明 68
2.1.3 塊作用域函數(shù) 70
2.2 spread/rest 71
2.3 默認(rèn)參數(shù)值 73
2.4 解構(gòu) 77
2.4.1 對(duì)象屬性復(fù)制模式 78
2.4.2 不只是聲明 79
2.4.3 重復(fù)賦值 81
2.5 太多,太少,剛剛好 83
2.5.1 默認(rèn)值賦值 84
2.5.2 嵌套解構(gòu) 84
2.5.3 解構(gòu)參數(shù) 85
2.6 對(duì)象字面量擴(kuò)展 90
2.6.1 簡(jiǎn)潔屬性 90
2.6.2 簡(jiǎn)潔方法 90
2.6.3 計(jì)算屬性名 95
2.6.4 設(shè)定[[Prototype]] 96
2.6.5 super對(duì)象 97
2.7 模板字面量 98
2.7.1 插入表達(dá)式 99
2.7.2 標(biāo)簽?zāi)0遄置媪?100
2.8 箭頭函數(shù) 103
2.9 for..of循環(huán) 109
2.10 正則表達(dá)式 111
2.10.1 Unicode標(biāo)識(shí) 111
2.10.2 定點(diǎn)標(biāo)識(shí) 112
2.10.3 正則表達(dá)式flags 116
2.11 數(shù)字字面量擴(kuò)展 117
2.12 Unicode 118
2.12.1 支持Unicode的字符串運(yùn)算 119
2.12.2 字符定位 121
2.12.3 Unicode標(biāo)識(shí)符名 123
2.13 符號(hào) 123
2.13.1 符號(hào)注冊(cè) 125
2.13.2 作為對(duì)象屬性的符號(hào) 127
2.14 小結(jié) 128
第 3 章 代碼組織 129
3.1 迭代器 129
3.1.1 接口 130
3.1.2 next()迭代 131
3.1.3 可選的return(..)和throw(..) 132
3.1.4 迭代器循環(huán) 133
3.1.5 自定義迭代器 134
3.1.6 迭代器消耗 137
3.2 生成器 138
3.2.1 語(yǔ)法 139
3.2.2 迭代器控制 144
3.2.3 提前完成 147
3.2.4 錯(cuò)誤處理 149
3.2.5 Transpile生成器 151
3.2.6 生成器使用 152
3.3 模塊 153
3.3.1 舊方法 153
3.3.2 前進(jìn) 154
3.3.3 新方法 156
3.3.4 模塊依賴環(huán) 164
3.3.5 模塊加載 166
3.4 類 167
3.4.1 class 168
3.4.2 extends和super 169
3.4.3 new.target 174
3.4.4 static 175
3.5 小結(jié) 176
第 4 章 異步流控制 177
4.1 Promise 177
4.1.1 構(gòu)造和使用Promise 178
4.1.2 Thenable 180
4.1.3 Promise API 181
4.2 生成器 + Promise 183
4.3 小結(jié) 185
第 5 章 集合 187
5.1 TypedArray 187
5.1.1 大小端(Endianness) 188
5.1.2 多視圖 189
5.1.3 帶類數(shù)組構(gòu)造器 190
5.2 Map 192
5.2.1 Map值 194
5.2.2 Map鍵 194
5.3 WeakMap 195
5.4 Set 196
5.5 WeakSet 198
5.6 小結(jié) 199
第 6 章 新增API 200
6.1 Array 200
6.1.1 靜態(tài)函數(shù)Array.of(..) 200
6.1.2 靜態(tài)函數(shù)Array.from(..) 201
6.1.3 創(chuàng)建數(shù)組和子類型 204
6.1.4 原型方法copyWithin(..) 205
6.1.5 原型方法fill(..) 206
6.1.6 原型方法find(..) 206
6.1.7 原型方法findIndex(..) 207
6.1.8 原型方法entries()、values()、keys() 208
6.2 Object 209
6.2.1 靜態(tài)函數(shù)Object.is(..) 209
6.2.2 靜態(tài)函數(shù)Object.getOwnPropertySymbols(..) 210
6.2.3 靜態(tài)函數(shù)Object.setPrototypeOf(..) 210
6.2.4 靜態(tài)函數(shù)Object.a(chǎn)ssign(..) 211
6.3 Math 212
6.4 Number 214
6.4.1 靜態(tài)屬性 214
6.4.2 靜態(tài)函數(shù)Number.isNaN(..) 214
6.4.3 靜態(tài)函數(shù)Number.isFinite(..) 215
6.4.4 整型相關(guān)靜態(tài)函數(shù) 215
6.5 字符串 216
6.5.1 Unicode函數(shù) 217
6.5.2 靜態(tài)函數(shù)String.raw(..) 217
6.5.3 原型函數(shù)repeat(..) 217
6.5.4 字符串檢查函數(shù) 218
6.6 小結(jié) 218
第 7 章 元編程 219
7.1 函數(shù)名稱 219
7.2 元屬性 222
7.3 公開符號(hào) 223
7.3.1 Symbol.iterator 223
7.3.2 Symbol.toStringTag與Symbol.hasInstance 224
7.3.3 Symbol.species 225
7.3.4 Symbol.toPrimitive 226
7.3.5 正則表達(dá)式符號(hào) 226
7.3.6 Symbol.isConcatSpreadable 227
7.3.7 Symbol.unscopables 228
7.4 代理 228
7.4.1 代理局限性 231
7.4.2 可取消代理 232
7.4.3 使用代理 233
7.5 Reflect API 240
7.6 特性測(cè)試 243
7.7 尾遞歸調(diào)用(Tail Call Optimization,TCO) 245
7.7.1 尾調(diào)用重寫 247
7.7.2 非TCO優(yōu)化 248
7.7.3 元在何處 250
7.8 小結(jié) 251
第 8 章 ES6之后 253
8.1 異步函數(shù) 254
8.2 Object.observe(..) 257
8.2.1 自定義改變事件 258
8.2.2 結(jié)束觀測(cè) 259
8.3 冪運(yùn)算符 260
8.4 對(duì)象屬性與... 260
8.5 Array#includes 261
8.6 SIMD 262
8.7 WebAssembly (WASM) 262
8.8 小結(jié) 264