目录
1. 前言
2. ECMAScript 6 简介
3. let 和 const 命令
4. 变量的解构赋值
5. 字符串的扩展
6. 正则的扩展
7. 数值的扩展
8. 数组的扩展
9. 函数的扩展
10. 对象的扩展
11. Symbol
12. Set 和 Map 数据结构
13. Proxy
14. Reflect
15. Promise 对象
16. Iterator 和 for...of 循环
17. Generator 函数的语法
18. Generator 函数的异步应用
19. async 函数
20. Class
21. Decorator
22. Module 的语法
23. Module 的加载实现
24. 编程风格
25. 读懂规格
26. 二进制数组
27. SIMD
28. 参考链接
ECMAScript 6简介
1. ECMAScript 和 JavaScript 的关系
2. ES6 与 ECMAScript 2015 的关系
3. 语法提案的批准流程
4. ECMAScript 的历史
5. 部署进度
6. Babel转码器
7. Traceur转码器
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月
正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为
企业级开发语言。
1. ECMAScript 和 JavaScript 的关系
一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系?
要讲清楚这个问题,需要回顾历史。1996年11月,JavaScript 的创造者 Netscape 公
司,决定将 JavaScript 提交给国际标准化组织ECMA,希望这种语言能够成为国际标准。
次年,ECMA 发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标
准,并将这种语言称为 ECMAScript,这个版本就是1.0版。
该标准从一开始就是针对 JavaScript 语言制定的,但是之所以不叫 JavaScript,有两个原
因。一是商标,Java 是 Sun 公司的商标,根据授权协议,只有 Netscape 公司可以合法
地使用 JavaScript 这个名字,且 JavaScript 本身也已经被 Netscape 公司注册为商标。
二是想体现这门语言的制定者是 ECMA,不是 Netscape,这样有利于保证这门语言的开放
性和中立性。
因此,ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现
(另外的 ECMAScript 方言还有 Jscript 和 ActionScript)。日常场合,这两个词是可以
互换的。
2. ES6 与 ECMAScript 2015 的关系
ECMAScript 2015(简称 ES2015)这个词,也是经常可以看到的。它与 ES6 是什么关
系呢?
2011年,ECMAScript 5.1版发布后,就开始制定6.0版了。因此,ES6 这个词的原意,就
是指 JavaScript 语言的下一个版本。
但是,因为这个版本引入的语法功能太多,而且制定过程当中,还有很多组织和个人不断提
交新功能。事情很快就变得清楚了,不可能在一个版本里面包括所有将要引入的功能。常规
的做法是先发布6.0版,过一段时间再发6.1版,然后是6.2版、6.3版等等。
但是,标准的制定者不想这样做。他们想让标准的升级成为常规流程:任何人在任何时候,
都可以向标准委员会提交新语法的提案,然后标准委员会每个月开一次会,评估这些提案是
否可以接受,需要哪些改进。如果经过多次会议以后,一个提案足够成熟了,就可以正式进
入标准了。这就是说,标准的版本升级成为了一个不断滚动的流程,每个月都会有变动。
标准委员会最终决定,标准在每年的6月份正式发布一次,作为当年的正式版本。接下来的
时间,就在这个版本的基础上做改动,直到下一年的6月份,草案就自然变成了新一年的版
本。这样一来,就不需要以前的版本号了,只要用年份标记就可以了。
ES6 的第一个版本,就这样在2015年6月发布了,正式名称就是《ECMAScript 2015标
准》(简称 ES2015)。2016年6月,小幅修订的《ECMAScript 2016标准》(简称
ES2016)如期发布,这个版本可以看作是 ES6.1 版,因为两者的差异非常小(只新增了
数组实例的
includes
方法和指数运算符),基本上是同一个标准。根据计划,2017年6月发
布 ES2017 标准。
因此,ES6 既是一个历史名词,也是一个泛指,含义是5.1版以后的 JavaScript 的下一代
标准,涵盖了ES2015、ES2016、ES2017等等,而ES2015 则是正式名称,特指该年发
布的正式版本的语言标准。本书中提到 ES6 的地方,一般是指 ES2015 标准,但有时也是
泛指“下一代 JavaScript 语言”。
3. 语法提案的批准流程
任何人都可以向标准委员会(又称 TC39 委员会)提案,要求修改语言标准。
一种新的语法从提案到变成正式标准,需要经历五个阶段。每个阶段的变动都需要由 TC39
委员会批准。
Stage 0 - Strawman(展示阶段)
Stage 1 - Proposal(征求意见阶段)
Stage 2 - Draft(草案阶段)
Stage 3 - Candidate(候选人阶段)
Stage 4 - Finished(定案阶段)
一个提案只要能进入 Stage 2,就差不多肯定会包括在以后的正式标准里面。ECMAScript
当前的所有提案,可以在 TC39 的官方网站Github.com/tc39/ecma262查看。
-
-
-
-
-
本书的写作目标之一,是跟踪 ECMAScript 语言的最新进展,介绍5.1版本以后所有的新语
法。对于那些明确或很有希望,将要列入标准的新语法,都将予以介绍。
4. ECMAScript 的历史
ES6 从开始制定到最后发布,整整用了15年。
前面提到,ECMAScript 1.0是1997年发布的,接下来的两年,连续发布了 ECMAScript
2.0(1998年6月)和 ECMAScript 3.0(1999年12月)。3.0版是一个巨大的成功,在业
界得到广泛支持,成为通行标准,奠定了 JavaScript 语言的基本语法,以后的版本完全继
承。直到今天,初学者一开始学习 JavaScript,其实就是在学3.0版的语法。
2000年,ECMAScript 4.0开始酝酿。这个版本最后没有通过,但是它的大部分内容被ES6
继承了。因此,ES6制定的起点其实是2000年。
为什么ES4没有通过呢?因为这个版本太激进了,对ES3做了彻底升级,导致标准委员会的
一些成员不愿意接受。ECMA的第39号技术专家委员会(Technical Committee 39,简称
TC39)负责制订ECMAScript标准,成员包括Microsoft、Mozilla、Google等大公司。
2007年10月,ECMAScript 4.0版草案发布,本来预计次年8月发布正式版本。但是,各方
对于是否通过这个标准,发生了严重分歧。以Yahoo、Microsoft、Google为首的大公司,
反对JavaScript的大幅升级,主张小幅改动;以JavaScript创造者Brendan Eich为首的
Mozilla公司,则坚持当前的草案。
2008年7月,由于对于下一个版本应该包括哪些功能,各方分歧太大,争论过于激烈,
ECMA开会决定,中止ECMAScript 4.0的开发,将其中涉及现有功能改善的一小部分,发
布为ECMAScript 3.1,而将其他激进的设想扩大范围,放入以后的版本,由于会议的气
氛,该版本的项目代号起名为Harmony(和谐)。会后不久,ECMAScript 3.1就改名为
ECMAScript 5。
2009年12月,ECMAScript 5.0版正式发布。Harmony项目则一分为二,一些较为可行的
设想定名为JavaScript.next继续开发,后来演变成ECMAScript 6;一些不是很成熟的设
想,则被视为JavaScript.next.next,在更远的将来再考虑推出。TC39委员会的总体考虑
是,ES5与ES3基本保持兼容,较大的语法修正和新功能加入,将由JavaScript.next完
成。当时,JavaScript.next指的是ES6,第六版发布以后,就指ES7。TC39的判断是,
ES5会在2013年的年中成为JavaScript开发的主流标准,并在此后五年中一直保持这个位
置。
2011年6月,ECMAscript 5.1版发布,并且成为ISO国际标准(ISO/IEC
16262:2011)。
2013年3月,ECMAScript 6草案冻结,不再添加新功能。新的功能设想将被放到
ECMAScript 7。
2013年12月,ECMAScript 6草案发布。然后是12个月的讨论期,听取各方反馈。
2015年6月,ECMAScript 6正式通过,成为国际标准。从2000年算起,这时已经过去了
15年。
5. 部署进度
各大浏览器的最新版本,对ES6的支持可以查看kangax.github.io/es5-compat-
table/es6/。随着时间的推移,支持度已经越来越高了,ES6的大部分特性都实现了。
Node.js是JavaScript语言的服务器运行环境,对ES6的支持度比浏览器更高。通过
Node,可以体验更多ES6的特性。建议使用版本管理工具nvm,来安装Node,因为可以自
由切换版本。不过,
nvm
不支持Windows系统,如果你使用Windows系统,下面的操作可
以改用nvmw或nvm-windows代替。
安装nvm需要打开命令行窗口,运行下面的命令。
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/<version number>/
install
上面命令的
version number
处,需要用版本号替换。本节写作时的版本号是
v0.29.0
。该命
令运行后,
nvm
会默认安装在用户主目录的
.nvm
子目录。
然后,激活
nvm
。
$ source ~/.nvm/nvm.sh
激活以后,安装Node的最新版。
$ nvm install node
安装完成后,切换到该版本。
$ nvm use node
使用下面的命令,可以查看Node所有已经实现的ES6特性。
$ node --v8-options | grep harmony
--harmony_typeof
--harmony_scoping
--harmony_modules
--harmony_symbols
--harmony_proxies