书海网短评:
√不识老尼,枉为前端攻城狮,其成名作《JS高级程序设计》曾名动江湖。 √Redux缔造者与React核心成员作序力荐,盛赞本书对JS的剖析无人企及。 √用直截了当的方式传达艰深的技术细节,
√不识老尼,枉为前端攻城狮,其成名作《JS高级程序设计》曾名动江湖。
√Redux缔造者与React核心成员作序力荐,盛赞《深入理解ES6》对JS的剖析无人企及。
√用直截了当的方式传达艰深的技术细节,对技术的理解方可高效送达。
√中高级开发者藉由《深入理解ES6》可一举迈入对标准及其未来特性熟稔于心之化境。
ES6是ECMAScript标准十余年来变动大的一个版本,其中添加了许多新的语法特性,既有大家耳熟能详的Promise,也有闻所未闻的Proxy代理和Reflection反射;既有可以通过转译器(Transpiler)等方式在旧版本浏览器中实现兼容的let、const、不定参数、展开运算符等功能,亦有无论如何都无法实现向前兼容的尾调用优化。深入理解ES6的特性对于所有JavaScript开发者而言至关重要,在可预见的未来,ES6中引入的语言特性会成为JavaScript应用程序的主流特性,这也是《深入理解ES6》的初衷。希望你通过阅读《深入理解ES6》可以了解ES6的新特性,并在需要时能够随时使用。
NicholasC.Zakas自2000年以来一直致力于Web应用程序的开发,重点关注前端开发,并以写作和讲述前沿*实践而闻名。他曾于雅虎主页任职5年有余,他也是多《深入理解ES6》的作者,其中包括ThePrinciplesofObject-OrientedJavaScript(NoStarchPress出版社)和ProfessionalJavaScriptforWebDevelopers(Wrox出版社)。
关于技术评审
JuriyZaytsev(在网上以kangax著称)是纽约的一位前端网站开发人员。自2007年以来,他一直在探索JavaScript的怪异特性并撰写相关文章。Juriy为多个开源项目做出过贡献,其中包括Prototype.js和其他的热门项目,如他自己的Fabric.js。他是按需定制打印服务printio.ru的共同创始人,目前任职于Facebook。
刘振涛,腾讯前端工程师;infoQ网站资深译者,负责重点连载专栏《深入浅出ES6》;长期关注Web开发领域新生,尤其是Ecma*6;爱好摄影、网球,重度信息癖(Infomania)患者。
第1章块级作用域绑定1
var声明及变量提升(Hoisting)机制1
块级声明3
--let声明3
--禁止重声明4
--const声明4
--临时死区(TemporalDeadZone)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
--在ECMAScript5中模拟默认参数38
--ECMAScript6中的默认参数值38
--默认参数值对arguments对象的影响40
--默认参数表达式42
--默认参数的临时死区44
处理无命名参数46
--ECMAScript5中的无命名参数46
--不定参数47
增强的Function构造函数49
展开运算符50
name属性52
--如何选择合适的名称52
--name属性的特殊情况52
明确函数的多重用途54
--在ECMAScript5中判断函数被调用的方法54
--元属性(Metaproperty)new.target55
块级函数57
--块级函数的使用场景58
--非严格模式下的块级函数58
箭头函数59
--箭头函数语法60
--创建立即执行函数表达式62
--箭头函数没有this绑定63
--箭头函数和数组65
--箭头函数没有arguments绑定66
--箭头函数的辨识方法66
尾调用优化67
--ECMAScript6中的尾调用优化68
--如何利用尾调用优化69
小结71
第4章扩展对象的功能性72
对象类别72
对象字面量语法扩展73
--属性初始值的简写73
--对象方法的简写语法74
--可计算属性名(ComputedPropertyName)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
创建Symbol107
Symbol的使用方法109
Symbol共享体系110
Symbol与类型强制转换112
Symbol属性检索112
通过well-knownSymbol暴露内部操作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
ECMAScript5中的Set集合与Map集合129
该解决方案的一些问题129
ECMAScript6中的Set集合131
--创建Set集合并添加元素131
--移除元素133
--Set集合的forEach()方法133
--将Set集合转换为数组136
--WeakSet集合136
ECMAScript6中的Map集合139
--Map集合支持的方法140
--Map集合的初始化方法141
--Map集合的forEach()方法142
--WeakMap集合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
ECMAScript5中的近类结构181
类的声明182
--基本的类声明语法182
--为何使用类语法184
类表达式186
--基本的类表达式语法186
--命名类表达式187
作为一等公民的类189
访问器属性190
可计算成员名称192
生成器方法193
静态成员195
继承与派生类196
--类方法遮蔽199
--静态成员继承199
--派生自表达式的类200
--内建对象的继承203
--Symbol.species属性205
在类的构造函数中使用new.target208
小结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
--创建未完成的Promise242
--创建已处理的Promise244
--执行器错误247
全局的Promise拒绝处理248
Node.js环境的拒绝处理248
浏览器环境的拒绝处理251
串联Promise253
--捕获错误254
--Promise链的返回值255
--在Promise链中返回Promise256
响应多个Promise259
--Promise.all()方法259
--Promise.race()方法260
自Promise继承262
基于Promise的异步任务执行263
小结267
第12章代理(Proxy)和反射(Reflection)API269
数组问题269
代理和反射270
创建一个简单的代理271
使用set陷阱验证属性272
用get陷阱验证对象结构(ObjectShape)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
附录AECMAScript6中较小的改动331
附录B了解ECMAScript7(2016)337
索引343
《深入理解ES6》:
十年前谁也无法料到,彼时只能写小动画的玩具语言JavaScript竟会有如今之威力,这愈发显现出Atwood定律“凡是能用JavaScript写出来的应用,最终都会用JavaScript来写”的正确性。追本溯源,这与ECMAScript的发展功不可没。
然而,ECMAScript的发展并非一帆风顺。
1999年末,ECMA-262第3版[1]正式定稿,在之后的五六年中,几乎看不到标准的任何新进展。直到2005年左右,随着Google在多个重交互的应用中普及Ajax,开发者们逐渐接受这项新技术并逐步恢复对JavaScript的关注。于是,JavaScript创始人BrendanEich紧锣密鼓地筹划ECMAScript4标准,直到2007年,耗时两年的ECMAScript4标准扩充工作在JeffDyer看来已经达到ECMAScript3的两倍[2],Brendan遂撰文[3]进一步澄清与解释。
DouglasCrockford认为这是一种过度复杂的税负[4],并联合微软起草ECMAScript3.1提案,同时,微软也在TC-39会议中正式反对ES4中的部分标准。冲突过后,占据舆论优势的ECMAScript3.1于2009年作为ES5正式发布[5]。
ECMAScript4并未就此消亡。委员会全体成员将ECMAScript3.1与ECMAScript4中的精华保留,作为ECMAScriptHarmony(取和谐之意),它转而成为委员会的下一个目标ECMAScript6,并于2015年6月正式定稿,最终被命名为ECMAScript2015。委员会一改往日冗长的议程,约定每年必出一版,通常以当年年份命名。截至此书翻译完毕,ECMAScript2016也于2016年6月正式定稿[6],最新标准尚在进程中[7]。
《UnderstandingECMAScript6》一书是作者NicholasC.Zakas在GitHub开源社区[8]撰写而成。作为标准的转述者,存在部分理解误区合情合理,本译作基于NoStarchPress出版社于2016年8月出版的首印版,适当参考GitHub中的讨论集结而成。
在《深入理解ES6》翻译结束之际,感慨万千。首先感谢裕波,是他的引荐让我有机会翻译《深入理解ES6》。特别感谢李松峰老师、Hax老师与克军老师的不吝赐教,帮助我审校翻译内容。还要感谢博文视点的侠少(张春雨编辑),他高标准、严要求的专业态度时刻鞭策我前行。
感谢就职于腾讯的时光,带我入行的导师张坤、为我解答所有疑惑的Leader陈恕胜、共同学习成长的兄弟陈炜鑫及其他伙伴,你们一丝不苟的态度不断磨练我的心性。
……
译者序
十年前谁也无法料到,彼时只能写小动画的玩具语言JavaScript竟会有如今之威力,这愈发显现出Atwood定律“凡是能用JavaScript写出来的应用,最终都会用JavaScript来写”的正确性。追本溯源,这与ECMAScript的发展功不可没。
然而,ECMAScript的发展并非一帆风顺。
1999年末,ECMA-262第3版[1]正式定稿,在之后的五六年中,几乎看不到标准的任何新进展。直到2005年左右,随着Google在多个重交互的应用中普及Ajax,开发者们逐渐接受这项新技术并逐步恢复对JavaScript的关注。于是,JavaScript创始人BrendanEich紧锣密鼓地筹划ECMAScript4标准,直到2007年,耗时两年的ECMAScript4标准扩充工作在JeffDyer看来已经达到ECMAScript3的两倍[2],Brendan遂撰文[3]进一步澄清与解释。
DouglasCrockford认为这是一种过度复杂的税负[4],并联合微软起草ECMAScript3.1提案,同时,微软也在TC-39会议中正式反对ES4中的部分标准。冲突过后,占据舆论优势的ECMAScript3.1于2009年作为ES5正式发布[5]。
ECMAScript4并未就此消亡。委员会全体成员将ECMAScript3.1与ECMAScript4中的精华保留,作为ECMAScriptHarmony(取和谐之意),它转而成为委员会的下一个目标ECMAScript6,并于2015年6月正式定稿,最终被命名为ECMAScript2015。委员会一改往日冗长的议程,约定每年必出一版,通常以当年年份命名。截至此书翻译完毕,ECMAScript2016也于2016年6月正式定稿[6],最新标准尚在进程中[7]。
《UnderstandingECMAScript6》一书是作者NicholasC.Zakas在GitHub开源社区[8]撰写而成。作为标准的转述者,存在部分理解误区合情合理,本译作基于NoStarchPress出版社于2016年8月出版的首印版,适当参考GitHub中的讨论集结而成。
在《深入理解ES6》翻译结束之际,感慨万千。首先感谢裕波,是他的引荐让我有机会翻译《深入理解ES6》。特别感谢李松峰老师、Hax老师与克军老师的不吝赐教,帮助我审校翻译内容。还要感谢博文视点的侠少(张春雨编辑),他高标准、严要求的专业态度时刻鞭策我前行。
感谢就职于腾讯的时光,带我入行的导师张坤、为我解答所有疑惑的Leader陈恕胜、共同学习成长的兄弟陈炜鑫及其他伙伴,你们一丝不苟的态度不断磨练我的心性。
最后,特别要感谢我的母亲杨虹女士,每当我不堪于兼顾工作与翻译的时候,总是您的鼓励点亮我前进的道路。
在《深入理解ES6》的翻译过程中我力求还原作者本意,但限于时间与水平,翻译不当之处在所难免,还敬请各位读者不吝赐教,我也会及时与出版社同步以备再版时进行修正,或以勘误的形式公布。如您有任何想法与建议,欢迎写信至我的邮箱:lenville@gmail.com。
[1]https://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,3rdedition,December1999.pdf
[2]https://mail.mozilla.org/pipermail/es-discuss/2007-October/001442.html
[3]https://brendaneich.com/2007/11/es4-news-and-opinion/
[4]https://mail.mozilla.org/pipermail/es-discuss/2008-March/002529.html
[5]http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-2625theditionDecember2009.pdf
[6]https://www.ecma-international.org/ecma-262/7.0/index.html
[7]https://tc39.github.io/ecma262/
[8]https://github.com/nzakas/understandinges6
序
ECMAScript6如暴风雨般骤临世界,人们期待已久而它却突然出现,传播之快始料未及。每个人都与ECMAScript6有着一段不同的故事,以下是我的故事。
2013年,我还在一家创业公司工作,正在从iOS转向Web研发,之后我参加了JavaScript开源社区并共同创建了Redux。当时我正在努力学习Web开发,而且我非常害怕,我的团队必须在短短几个月的时间内将我们的产品用JavaScript重构为Web版。
起初我认为用JavaScript编写大型软件的想法很可笑,但是一名团队成员说服了我,他说JavaScript不是一门玩具语言。我同意撇开成见试一试,于是打开MDN和StackOverflow首次深入学习JavaScript。我对这门简约的语言着了迷,我的同事还教我如何使用工具,例如代码整理工具(linter)和代码合并工具(bundler)[译者注:代码压缩工具(minifier)对于生产力和性能来说也至关重要。]。在这几个星期里我恍然大悟,原来我如此喜欢编写JavaScript代码。
但没有一门语言是完美的,由于使用过其他语言,我非常希望JavaScript也可以频繁更新,但在这10年间,ECMAScript5是唯一的重大更新,它只实现了一小部分特性,完全支持浏览器需要数10年的时间。彼时,即将到来的代号为Harmony的ECMAScript6(ES6)规范尚未完成,遥遥无期。“也许在10年内我能够写一些ECMAScript6代码吧。”我想。
一些实验性的“转译器(Transpiler)”,如谷歌的Traceur,可以将代码从ECMAScript6转换成ECMAScript5。它们大多功能非常有限,或难以插入现有的JavaScript构建管道。但是,随后出现的新型转译器6to5改变了一切。它易于安装,可以很好地集成在现有的工具中,生成的代码可读,于是其像野火般蔓延开来。6to5现在被称作Babel,在标准定稿前就开始为主流受众提供ECMAScript6的特性。几个月以来,ECMAScript6无处不在。
出于各种原因,ECMAScript6已经把社区割裂开来。正如《深入理解ES6》所讲,在许多主流浏览器中ECMAScript6仍未完全实现。当你学习这门语言时,不得不进行的构建步骤足以使人退缩。一些库的文档和示例中有ECMAScript6的代码,你可能想知道这些库是否可以在ECMAScript5环境中使用。这令人感到困惑,由于这门语言之前几乎从未改变过,因此许多人对于新特性的加入并没有十分期待,而有一部分人在焦急地等待新功能的到来,并希望所有的这些新功能能放在一起使用—在某些情况下,甚至为了使用而使用,不管是否必要。
正当我对JavaScript的使用逐渐熟练时,我感觉再往前走很困难,我不得不学习一门新的语言。那几个月的时间里我感到很糟糕。最后在圣诞节前夕,我开始阅读《深入理解ES6》的草稿,我简直爱不释手,在凌晨3点,当参加聚会的每一位成员都已熟睡,而我却理解了ECMAScript6!
Nicholas是一位非常有天赋的老师。他以直截了当的方式传达深刻的细节,让你能够理解所有这些知识。除了《深入理解ES6》之外,他也因创建ESLint而出名,这是一个被下载了数百万次的JavaScript代码分析器。
Nicholas对JavaScript的了解程度很少有人能够企及,所以不要错过吸取新知识的机会。阅读《深入理解ES6》,你将对掌握ECMAScript6充满信心。
DanAbramov
React核心团队成员及Redux的创造者
前言
JavaScript核心的语言特性是在标准ECMA-262中被定义的。该标准中定义的语言被称作ECMAScript,它是JavaScript的子集。在浏览器与Node.js环境中通过附加的对象和方法可添加更多新功能,而JavaScript的核心依然保持ECMAScript的定义。总的来说,ECMA-262标准的持续发展对于JavaScript的成功功不可没。ECMAScript6是JavaScript最新的重大更新,《深入理解ES6》将为你讲解其中的改动。
ECMAScript6之路
2007年,JavaScript走向了发展中的转折点,逐渐兴起的Ajax开创了动态Web应用的新时代,而自1999年第三版ECMA-262发布以来,JavaScript却没有丝毫改变。当时,负责推动ECMAScript语言发展的TC-39委员会将大量规范草案整合在了ECMAScript4中,新增的语言特性涉足甚广,包括:模块、类、类继承、私有对象成员、可选类型注释及众多其他的特性。
然而,TC-39组织内部对ECMAScript4的动议草案产生了巨大分歧,部分成员认为不应该一次性在第四版标准中加入过多的新功能,而来自雅虎、谷歌和微软的技术负责人则共同商讨并提交了一份“ECMAScript3.1”草案作为下一代ECMAScript的可选方案,此处的“3.1”意在表明只是对现有标准进行小幅的增量修改。
ECMAScript3.1引入的语法变化极少,这一版标准相对而言更专注于优化属性特性,支持原生JSON,以及为已有对象增添新的方法。委员会曾经尝试融合ECMAScript3.1与ECMAScript4,但由于对峙双方对语言未来的发展方向分歧过大,最后以失败告终。
到了2008年,JavaScript创始人BrendanEich宣布TC-39委员会将合力推进ECMAScript3.1的标准化工作。他们选择将ECMAScript4中提出的大部分针对语法及特性的改动暂时搁置,到下一个版本ECMAScript的标准化工作完成之后,委员会全体成员再努力融合ECMAScript3.1和4中的精华,他们还给这个版本起了一个昵称—ECMAScriptHarmony(取和谐之意)。
经过标准化的ECMAScript3.1最终作为ECMA-262第五版正式发布,它同时也被称为ECMAScript5。委员会表示他们永不发布第四版,以避免与从未面世的“ECMAScript4”产生命名冲突。基于ECMAScriptHarmony的工作随后陆续展开,继承了精华的ECMAScript6将成为继ECMAScript5之后发布的首个新标准。
ECMAScript6标准的特性已于2015年全部完成,并被正式命名为“ECMAScript2015”(由于开发者们对ECMAScript6更为熟悉,因此《深入理解ES6》将继续沿用此称谓)。新标准的变化俯拾即是,大到全新的对象和模式、大幅的语法改动,小到为已有对象扩充新的方法。更令人激动的是,ECMAScript6中点滴的变化全都致力于解决开发者实际工作中遇到的问题。
关于《深入理解ES6》
深入理解ECMAScript6的特性对于所有JavaScript开发人员来说至关重要,在可预见的未来,ECMAScript6中引入的语言特性将构成构建JavaScript应用程序的基础。这也是《深入理解ES6》的初衷,笔者希望你通过阅读《深入理解ES6》来了解ECMAScript6的新特性,并在需要时随时能够予以使用。
浏览器与Node.js中的兼容性
开发者们正积极地为Web浏览器及Node.js这些JavaScript的宿主环境添加ECMAScript6的新功能。《深入理解ES6》只关注规范中定义的正确行为,不会对比每种实现间的差异。如此一来,读者所使用的JavaScript环境有可能与《深入理解ES6》中描述的不一致。
《深入理解ES6》的目标读者
《深入理解ES6》是专门为熟悉JavaScript和ECMAScript5的读者准备的指南,帮助大家理解ECMAScript5和6之间的差异。对ECMAScript6早已熟稔于心的读者不必继续阅读下去。《深入理解ES6》特别适合想了解语言未来特性的JavaScript中高级开发者,无论你的工作环境是Node.js还是Web浏览器,《深入理解ES6》都非常适合你。
《深入理解ES6》不适合从未写过JavaScript代码的初学者,读者们需要对这门语言的基础知识有一定的理解,这样才能发挥《深入理解ES6》的最大效用。
《深入理解ES6》概览
《深入理解ES6》中的每一个章节与附录都涵盖有ECMAScript6的不同方面,许多章节一开始都会讨论ECMAScript6中新变化的来龙去脉,以及这些改动试图解决的问题。所有章节都包含代码示例来帮助你学习新的语法及概念。
第1章块级作用域绑定讨论var在块级作用域中的替代方案—let和const。
第2章字符串和正则表达式详尽介绍字符串模板,以及新增的操作与检查字符串的功能。
第3章函数讨论函数的多处改动,包括箭头函数(ArrowFunction)、默认参数(DefaultParameters)、不定参数(RestParameters)等。
第4章扩展对象的功能性解读对象创建、修改及使用方面的改动,包括对象字面量语法的变化、新的反射方法等。
第5章解构:使数据访问更便捷介绍一种通过简明的语法分解对象和数组的方法—对象和数组解构。
第6章Symbol和Symbol属性介绍定义属性的新途径—Symbol。Symbol是一种新的原始类型,可用于创建外部无法直接访问的对象属性和方法。
第7章Set集合与Map集合详述四种新的集合类型:Set、WeakSet、Map及WeakMap。这些类型为数组增添了新的语义、去重机制,以及专门为JavaScript设计的内存管理机制,极大地扩展了数组的实用性。
第8章迭代器(Iterator)和生成器(Generator)这两个全新的功能可以协助你更有效地处理集合数据,在早期版本的JavaScript中无法实现这样的功能。
第9章JavaScript中的类介绍JavaScript中首次正式加入的类概念。接触过其他语言的开发者通常会对JavaScript的语法感到困惑,新增的类语法使JavaScript变得更易上手,而且对热衷于JavaScript的开发者来说新的语法变得更加简洁。
第10章改进数组的功能详述针对原生数组进行的改动,以及这些有趣的变化为开发者所带来的新体验。
第11章Promise与异步编程介绍语言的新成员—Promise。它是草根群体不断努力的结晶,由于各大JavaScript库的鼎立支持,这一功能逐渐被广大开发者所接受。ECMAScript6正式将Promise纳入标准并为其提供可用的Polyfill。
第12章代理(Proxy)和反射(Reflection)API介绍正式加入JavaScript的反射API和新的代理对象,开发者可以通过代理对象拦截每一个在对象中执行的操作,代理也赋予了开发者空前的对象控制权,同样也为定义新的交互模式带来无限可能。
第13章用模块封装代码详述JavaScript的官方模块风格。加入这一定义旨在代替过去几年中出现过的许多非正式的模块定义风格。
附录AECMAScript6中较小的改动涵盖了ECMAScript6中实现的其他改动,它们与每一章所涉及的主题关系不大,一般很少使用这些功能。
附录B了解ECMAScript7(2016)描述了在ECMAScript7中实现的三个附加功能,它们在近期的影响力不会像ECMAScript6一样大。
排版约定
《深入理解ES6》使用以下的排版约定:
等宽字体代码块表示较长的代码示例,如下所示:
functiondoSomething(){//empty}
在代码块中,console.log()语句右侧的注释表示在浏览器或Node.js控制台中显示的代码执行结果,例如:
console.log("Hi");//"Hi"
如果代码块中的某行代码引发错误,也会在代码的右侧指示:
doSomething();//抛出错误
帮助与支持
如果你在阅读《深入理解ES6》时有任何疑问,请发送邮件至我的邮件列表,地址为http://groups.google.com/group/zakasbooks。









