第1章 块级作用域绑定 1
var声明及变量提升(Hoisting)机制 1
块级声明 3
let声明 3
禁止重声明 4
const声明 4
临时死区(Temporal Dead Zone) 6
循环中的块作用域绑定 7
循环中的函数 8
循环中的let声明 9
循环中的const声明 10
全局块作用域绑定 12
块级绑定最佳实践的进化 13
小结 13
第2章 字符串和正则表达式 14
更好的Unicode支持 14
UTF-16码位 15
codePointAt()方法 16
String.fromCodePoint()方法 17
normalize()方法 17
正则表达式u修饰符 19
其他字符串变更 21
字符串中的子串识别 21
repeat()方法 22
其他正则表达式语法变更 23
正则表达式y修饰符 23
正则表达式的复制 26
flags属性 27
模板字面量 28
基础语法 28
多行字符串 29
字符串占位符 31
标签模板 32
小结 36
第3章 函数 37
函数形参的默认值 37
在ECMAScript 5中模拟默认参数 38
ECMAScript 6中的默认参数值 38
默认参数值对arguments对象的影响 40
默认参数表达式 42
默认参数的临时死区 44
处理无命名参数 46
ECMAScript 5中的无命名参数 46
不定参数 47
增强的Function构造函数 49
展开运算符 50
name属性 52
如何选择合适的名称 52
name属性的特殊情况 52
明确函数的多重用途 54
在ECMAScript 5中判断函数被调用的方法 54
元属性(Metaproperty)new.target 55
块级函数 57
块级函数的使用场景 58
非严格模式下的块级函数 58
箭头函数 59
箭头函数语法 60
创建立即执行函数表达式 62
箭头函数没有this绑定 63
箭头函数和数组 65
箭头函数没有arguments绑定 66
箭头函数的辨识方法 66
尾调用优化 67
ECMAScript 6中的尾调用优化 68
如何利用尾调用优化 69
小结 71
第4章 扩展对象的功能性 72
对象类别 72
对象字面量语法扩展 73
属性初始值的简写 73
对象方法的简写语法 74
可计算属性名(Computed Property Name) 75
新增方法 76
Object.is()方法 76
Object.assign()方法 77
重复的对象字面量属性 80
自有属性枚举顺序 81
增强对象原型 82
改变对象的原型 82
简化原型访问的Super引用 83
正式的方法定义 86
小结 88
第5章 解构:使数据访问更便捷 89
为何使用解构功能 89
对象解构 90
解构赋值 91
默认值 92
为非同名局部变量赋值 93
嵌套对象解构 94
数组解构 96
解构赋值 97
默认值 99
嵌套数组解构 99
不定元素 99
混合解构 101
解构参数 102
必须传值的解构参数 103
解构参数的默认值 104
小结 106
第6章 Symbol和Symbol属性 107
创建Symbol 107
Symbol的使用方法 109
Symbol共享体系 110
Symbol与类型强制转换 112
Symbol属性检索 112
通过well-known Symbol暴露内部操作 113
Symbol.hasInstance方法 114
Symbol.isConcatSpreadable属性 116
Symbol.match、Symbol.replace、Symbol.search和Symbol.split属性 118
Symbol.toPrimitive方法 120
Symbol.toStringTag属性 122
Symbol.unscopables属性 125
小结 127
第7章 Set集合与Map集合 128
ECMAScript 5中的Set集合与Map集合 129
该解决方案的一些问题 129
ECMAScript 6中的Set集合 131
创建Set集合并添加元素 131
移除元素 133
Set集合的forEach()方法 133
将Set集合转换为数组 136
Weak Set集合 136
ECMAScript 6中的Map集合 139
Map集合支持的方法 140
Map集合的初始化方法 141
Map集合的forEach()方法 142
Weak Map集合 143
小结 147
第8章 迭代器(Iterator)和生成器(Generator) 149
循环语句的问题 149
什么是迭代器 150
什么是生成器 151
生成器函数表达式 153
生成器对象的方法 154
可迭代对象和for-of循环 155
访问默认迭代器 156
创建可迭代对象 157
内建迭代器 158
集合对象迭代器 158
字符串迭代器 163
NodeList迭代器 164
展开运算符与非数组可迭代对象 165
高级迭代器功能 166
给迭代器传递参数 166
在迭代器中抛出错误 168
生成器返回语句 170
委托生成器 171
异步任务执行 174
简单任务执行器 174
向任务执行器传递数据 176
异步任务执行器 177
小结 180
第9章 JavaScript中的类 181
ECMAScript 5中的近类结构 181
类的声明 182
基本的类声明语法 182
为何使用类语法 184
类表达式 186
基本的类表达式语法 186
命名类表达式 187
作为一等公民的类 189
访问器属性 190
可计算成员名称 192
生成器方法 193
静态成员 195
继承与派生类 196
类方法遮蔽 199
静态成员继承 199
派生自表达式的类 200
内建对象的继承 203
Symbol.species属性 205
在类的构造函数中使用new.target 208
小结 210
第10章 改进的数组功能 211
创建数组 211
Array.of()方法 212
Array.from()方法 213
为所有数组添加的新方法 216
find()方法和findIndex()方法 217
fill()方法 217
copyWithin()方法 218
定型数组 219
数值数据类型 220
数组缓冲区 221
通过视图操作数组缓冲区 221
定型数组与普通数组的相似之处 228
通用方法 229
相同的迭代器 230
of()方法和from()方法 230
定型数组与普通数组的差别 231
行为差异 231
缺失的方法 232
附加方法 233
小结 234
第11章 Promise与异步编程 235
异步编程的背景知识 235
事件模型 236
回调模式 236
Promise的基础知识 239
Promise的生命周期 239
创建未完成的Promise 242
创建已处理的Promise 244
执行器错误 247
全局的Promise拒绝处理 248
Node.js环境的拒绝处理 248
浏览器环境的拒绝处理 251
串联Promise 253
捕获错误 254
Promise链的返回值 255
在Promise链中返回Promise 256
响应多个Promise 259
Promise.all()方法 259
Promise.race()方法 260
自Promise继承 262
基于Promise的异步任务执行 263
小结 267
第12章 代理(Proxy)和反射(Reflection)API 269
数组问题 269
代理和反射 270
创建一个简单的代理 271
使用set陷阱验证属性 272
用get陷阱验证对象结构(Object Shape) 274
使用has陷阱隐藏已有属性 275
用deleteProperty陷阱防止删除属性 277
原型代理陷阱 279
原型代理陷阱的运行机制 279
为什么有两组方法 281
对象可扩展性陷阱 282
两个基础示例 283
重复的可扩展性方法 284
属性描述符陷阱 285
给Object.defineProperty()添加限制 286
描述符对象限制 287
重复的描述符方法 288
ownKeys陷阱 290
函数代理中的apply和construct陷阱 291
验证函数参数 292
不用new调用构造函数 294
覆写抽象基类构造函数 296
可调用的类构造函数 297
可撤销代理 298
解决数组问题 299
检测数组索引 300
添加新元素时增加length的值 300
减少length的值来删除元素 302
实现MyArray类 304
将代理用作原型 307
在原型上使用get陷阱 307
在原型上使用set陷阱 308
在原型上使用has陷阱 309
将代理用作类的原型 310
小结 314
第13章 用模块封装代码 315
什么是模块 315
导出的基本语法 316
导入的基本语法 317
导入单个绑定 318
导入多个绑定 318
导入整个模块 318
导入绑定的一个微妙怪异之处 320
导出和导入时重命名 320
模块的默认值 321
导出默认值 321
导入默认值 322
重新导出一个绑定 323
无绑定导入 324
加载模块 325
在Web浏览器中使用模块 325
浏览器模块说明符解析 329
小结 330
附录A ECMAScript 6中较小的改动 331
附录B 了解ECMAScript 7(2016) 337
索引 343