ES6是迄今为止JavaScript内核首当其冲的一次重大更新。本书是领域大家Nicholas C. Zakas撰写的一份ES6的完整指南,书中详细讲解了ES 6在JavaScript对象类型、语法及其他方面激动人心的改变。每一章都含有可运行于任何JavaScript环境的示例代码,你可以利用这些代码测试、理解ES6中的新功能。无论你是Web开发者还是Node.js开发者,都可以通过本书来更好地理解和运用ES6,或是顺利地从ES5迁移到ES6。
参透ECMAScript标准不啻前端通行证 随一代宗师参详JavaScript精进之路
序
ECMAScript 6如暴风雨般骤临世界,人们期待已久而它却突然出现,传播之快始料未及。每个人都与ECMAScript 6有着一段不同的故事,以下是我的故事。
2013年,我还在一家创业公司工作,正在从iOS转向Web研发,之后我参加了JavaScript开源社区并共同创建了Redux。当时我正在努力学习Web开发,而且我非常害怕,我的团队必须在短短几个月的时间内将我们的产品用JavaScript 重构为Web版。
起初我认为用JavaScript编写大型软件的想法很可笑,但是一名团队成员说服了我,他说JavaScript不是一门玩具语言。我同意撇开成见试一试,于是打开MDN和StackOverflow首次深入学习JavaScript。我对这门简约的语言着了迷,我的同事还教我如何使用工具,例如代码整理工具(linter)和代码合并工具(bundler) 。在这几个星期里我恍然大悟,原来我如此喜欢编写JavaScript代码。
但没有一门语言是完美的,由于使用过其他语言,我非常希望JavaScript也可以频繁更新,但在这10年间,ECMAScript 5是唯一的重大更新,它只实现了一小部分特性,完全支持浏览器需要数10年的时间。彼时,即将到来的代号为Harmony的ECMAScript 6(ES6)规范尚未完成,遥遥无期。“也许在10年内我能够写一些ECMAScript 6代码吧。”我想。
一些实验性的“转译器(Transpiler)”,如谷歌的Traceur,可以将代码从ECMAScript 6转换成ECMAScript 5。它们大多功能非常有限,或难以插入现有的JavaScript构建管道。但是,随后出现的新型转译器 6to5改变了一切。它易于安装,可以很好地集成在现有的工具中,生成的代码可读,于是其像野火般蔓延开来。6to5现在被称作Babel,在标准定稿前就开始为主流受众提供ECMAScript 6的特性。几个月以来,ECMAScript 6无处不在。
出于各种原因,ECMAScript 6已经把社区割裂开来。正如本书所讲,在许多主流浏览器中ECMAScript 6仍未完全实现。当你学习这门语言时,不得不进行的构建步骤足以使人退缩。一些库的文档和示例中有ECMAScript 6的代码,你可能想知道这些库是否可以在ECMAScript 5环境中使用。这令人感到困惑,由于这门语言之前几乎从未改变过,因此许多人对于新特性的加入并没有十分期待,而有一部分人在焦急地等待新功能的到来,并希望所有的这些新功能能放在一起使用—在某些情况下,甚至为了使用而使用,不管是否必要。
正当我对JavaScript的使用逐渐熟练时,我感觉再往前走很困难,我不得不学习一门新的语言。那几个月的时间里我感到很糟糕。最后在圣诞节前夕,我开始阅读本书的草稿,我简直爱不释手,在凌晨3点,当参加聚会的每一位成员都已熟睡,而我却理解了ECMAScript 6!
Nicholas是一位非常有天赋的老师。他以直截了当的方式传达深刻的细节,让你能够理解所有这些知识。除了本书之外,他也因创建ESLint而出名,这是一个被下载了数百万次的JavaScript代码分析器。
Nicholas对JavaScript的了解程度很少有人能够企及,所以不要错过吸取新知识的机会。阅读本书,你将对掌握ECMAScript 6充满信心。
Dan Abramov
React核心团队成员及Redux的创造者
前言
JavaScript核心的语言特性是在标准ECMA-262中被定义的。该标准中定义的语言被称作ECMAScript,它是JavaScript的子集。在浏览器与Node.js环境中通过附加的对象和方法可添加更多新功能,而JavaScript的核心依然保持ECMAScript的定义。总的来说,ECMA-262标准的持续发展对于JavaScript的成功功不可没。ECMAScript 6是JavaScript最新的重大更新,本书将为你讲解其中的改动。
ECMAScript 6之路
2007年,JavaScript走向了发展中的转折点,逐渐兴起的Ajax开创了动态Web应用的新时代,而自1999年第三版ECMA-262发布以来,JavaScript却没有丝毫改变。当时,负责推动ECMAScript 语言发展的TC-39委员会将大量规范草案整合在了ECMAScript 4中,新增的语言特性涉足甚广,包括:模块、类、类继承、私有对象成员、可选类型注释及众多其他的特性。
然而,TC-39组织内部对ECMAScript 4的动议草案产生了巨大分歧,部分成员认为不应该一次性在第四版标准中加入过多的新功能,而来自雅虎、谷歌和微软的技术负责人则共同商讨并提交了一份“ECMAScript 3.1”草案作为下一代ECMAScript的可选方案,此处的“3.1”意在表明只是对现有标准进行小幅的增量修改。
ECMAScript 3.1引入的语法变化极少,这一版标准相对而言更专注于优化属性特性,支持原生JSON,以及为已有对象增添新的方法。委员会曾经尝试融合ECMAScript 3.1与ECMAScript 4,但由于对峙双方对语言未来的发展方向分歧过大,最后以失败告终。
到了2008年,JavaScript创始人Brendan Eich宣布TC-39委员会将合力推进ECMAScript 3.1的标准化工作。他们选择将ECMAScript 4中提出的大部分针对语法及特性的改动暂时搁置,到下一个版本ECMAScript的标准化工作完成之后,委员会全体成员再努力融合ECMAScript 3.1和4中的精华,他们还给这个版本起了一个昵称—ECMAScript Harmony(取和谐之意)。
经过标准化的ECMAScript 3.1最终作为ECMA-262第五版正式发布,它同时也被称为 ECMAScript 5。委员会表示他们永不发布第四版,以避免与从未面世的“ECMAScript 4”产生命名冲突。基于ECMAScript Harmony的工作随后陆续展开,继承了精华的ECMAScript 6将成为继ECMAScript 5之后发布的首个新标准。
ECMAScript 6标准的特性已于2015年全部完成,并被正式命名为“ECMAScript 2015”(由于开发者们对ECMAScript 6更为熟悉,因此本书将继续沿用此称谓)。新标准的变化俯拾即是,大到全新的对象和模式、大幅的语法改动,小到为已有对象扩充新的方法。更令人激动的是,ECMAScript 6中点滴的变化全都致力于解决开发者实际工作中遇到的问题。
关于本书
深入理解ECMAScript 6的特性对于所有JavaScript开发人员来说至关重要,在可预见的未来,ECMAScript 6中引入的语言特性将构成构建JavaScript应用程序的基础。这也是本书的初衷,笔者希望你通过阅读本书来了解ECMAScript 6的新特性,并在需要时随时能够予以使用。
浏览器与Node.js中的兼容性
开发者们正积极地为Web浏览器及Node.js这些JavaScript的宿主环境添加ECMAScript 6的新功能。本书只关注规范中定义的正确行为,不会对比每种实现间的差异。如此一来,读者所使用的JavaScript环境有可能与本书中描述的不一致。
本书的目标读者
本书是专门为熟悉JavaScript和ECMAScript 5的读者准备的指南,帮助大家理解ECMAScript 5和6之间的差异。对ECMAScript 6早已熟稔于心的读者不必继续阅读下去。本书特别适合想了解语言未来特性的JavaScript中高级开发者,无论你的工作环境是Node.js还是Web浏览器,本书都非常适合你。
本书不适合从未写过JavaScript代码的初学者,读者们需要对这门语言的基础知识有一定的理解,这样才能发挥本书的最大效用。
本书概览
本书中的每一个章节与附录都涵盖有ECMAScript 6的不同方面,许多章节一开始都会讨论ECMAScript 6 中新变化的来龙去脉,以及这些改动试图解决的问题。所有章节都包含代码示例来帮助你学习新的语法及概念。
? 第1章 块级作用域绑定 讨论var在块级作用域中的替代方案—let和const。
? 第2章 字符串和正则表达式 详尽介绍字符串模板,以及新增的操作与检查字符串的功能。
? 第3章 函数 讨论函数的多处改动,包括箭头函数(Arrow Function)、默认参数(Default Parameters)、不定参数(Rest Parameters)等。
? 第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库的鼎立支持,这一功能逐渐被广大开发者所接受。ECMAScript 6正式将Promise纳入标准并为其提供可用的Polyfill。
? 第12章 代理(Proxy)和反射(Reflection)API 介绍正式加入JavaScript的反射API和新的代理对象,开发者可以通过代理对象拦截每一个在对象中执行的操作,代理也赋予了开发者空前的对象控制权,同样也为定义新的交互模式带来无限可能。
? 第13章 用模块封装代码 详述JavaScript的官方模块风格。加入这一定义旨在代替过去几年中出现过的许多非正式的模块定义风格。
? 附录A ECMAScript 6中较小的改动 涵盖了ECMAScript 6中实现的其他改动,它们与每一章所涉及的主题关系不大,一般很少使用这些功能。
? 附录B 了解ECMAScript 7(2016) 描述了在ECMAScript 7中实现的三个附加功能,它们在近期的影响力不会像ECMAScript 6一样大。
应为“执行[[Call]]方法”
本页最后一行
应修改为:
本勘误共有两处
应当修改为:
类似的: 第12行(正文第二段)
应修改为:
应为: