如何更好的了解ECMAScript

如何更好的了解ECMAScript

本文源自于前段时间在团队内部的分享。稍微自己总结一下。

本文写自2016年9月21日。鉴于前端的飞速发展,一段时间后不能保证文章内的内容还没有过时。

// 恩,我在2017年7月12日更新了一下。


什么是ECMAScript

首先既然要更好的了解,起码得先说说什么是 ECMAScript。

ECMAScript 是一种由 ECMA国际(前身为欧洲计算机制造商协会)通过 ECMA-262 标准化的脚本程序设计语言。

看起来出现了很多奇怪的名词,ECMA国际?ECMA-262?黑人问号???

那么然后来稍微介绍一下什么是 ECMA国际。

ECMA国际

Ecma国际(Ecma International)是一家国际性会员制度的信息和电信标准组织。1994年之前,名为欧洲计算机制造商协会(European Computer Manufacturers Association)。因为计算机的国际化,组织的标准牵涉到很多其他国家,因此组织决定改名表明其国际性。现名称已不属于首字母缩略字。

与国家政府标准机构不同,Ecma国际是企业会员制的组织。组织的标准化过程比较商业化,自称这种营运方式减少官僚追求效果。

上面这些信息都可以在 WIKI 中找到。大家可以很明确的看到,Ecma国际是一家和企业密切相连的组织,所以 Ecma国际制定的规范都是由各类企业来做主要的制定和推广。

那么既然说到了 Ecma国际,那么它都做了些什么事呢?

其实 Ecma国际负责了很多标准的制定,比如有如下这些规范。大家可以看到这里面有我们今天的主角,ECMAScript 规范。

  • CD-ROM格式(之后被国际标准化组织批准为ISO 9660)
  • C#语言规范
  • C++/CLI语言规范
  • 通用语言架构(CLI)
  • ECMAScript语言规范(JavaScript)
  • Eiffel语言
  • 电子产品环境化设计要素
  • Universal 3D标准
  • OOXML
  • Dart语言规范

JAVASCRIPT的诞生

在说 ECMA262 之前,我们先来讲讲 javascript 的历史。

在1994年,Netscape 发布了 Navigator0.9,但是因为那个时候的浏览器缺乏和用户有良好交互的能力。所以 Netscape 急切渴望一门可以在浏览器中运行,可以提供一定用户交互的语言。

然后在1995年,Netscape 让 Brendan Eich 去开发这门语言。然而,javascript 诞生了。

然而在此之后,Microsoft 推出了一门类似的语言,JScript。

Netscape 为了提升 javascript 的竞争力,于是将 javascript 提供给 ECMA组织 进行标准化。

然后,1997年7月,ECMA262 标准出台。

时隔14年之后,ECMA-262 标准也被另一个国际标准化组织 ISO(International Organization for Standardization)在2011年6月批准,标准号是 ISO-16262。

ECMAScript 作为一门脚本程序设计语言标准,并不只有 javascript 这一种实现,它也有很多的方言实现。比如有下面这些语言:

  • JavaScript
  • Ejscript
  • JScript .NET
  • ActionScript
  • DMDScript
  • CriScript
  • InScript

飞速发展和稳定期

在 ECMAScript 规范初版发布后不久。

1998年6月,ECMAScript 2.0 发布。

1999年12月,ECMAScript 3.0 发布。

这时,ECMAScript 规范本身也相对比较完善和稳定了,但是接下来的事情,就比较悲剧了。

2007年10月。。。。ECMAScript 4.0 草案发布。

这次的新规范,历时颇久,规范的新内容也有了很多争议。

在制定ES4的时候,是分成了两个工作组同时工作的。

一边是以 Adobe, Mozilla, Opera 和 Google为主的 ECMAScript 4 工作组。

一边是以 Microsoft 和 Yahoo 为主的 ECMAScript 3.1 工作组。


ECMAScript 4 的很多主张比较激进,改动较大。而 ECMAScript 3.1 则主张小幅更新。

最终经过 TC39 的会议,决定将一部分不那么激进的改动保留发布为 ECMAScript 3.1,然后将一部分比较激进的部分放置到 ES.NEXT 中,命名为 Harmony(和谐),留待以后再进行商榷。接下来,ECMAScript 3.1 变成了 ECMAScript 5,而 ES.NEXT 中的那些特性,则有着相当一部分被ECMAScript 6,也就是 ECMAScript 2015 所吸收了。所以说虽然 ECMAScript 4 被废弃了,但是它终究还是通过另一种方式活了下来。

然后,2009年12月,ECMAScript 5 发布。

2011年6月,ECMAScript 5.1 发布。

TC39

中间插个小话题。其实在前面大家仔细看,会发现有个名词,TC39。为了接下来的内容,所以先来解释一下 TC39 是什么。

TC(Technical Committees)

TG(Task Groups)

在ECMA国际,每个标准都会有一个 TC 来负责,而一个 TC 中可能会有不同的 TG 来负责不同的工作。而负责 ECMA262,也就是我们所说的 ECMAScript 的就是 TC39(以前叫 TC39-TG1)。

Ecma organisation 在这里我们可以看到各个 TC,并且可以查看其负责的标准。

ECMAScript 2015

接下来是一部重头戏。

2015年6月,ECMAScript 6,也就是 ECMAScript 2015 发布了。

新的规范中,带有大量 ECMAScript 4 中激进特性,以及常年的提案积累。所以 ECMAScript 6 里和前一版标准有了非常大的差别。

从 ECMAScript 6 开始,标准有了新的,更加规范化和快速的制定流程。面对着每年一次的,频繁的标准更替,再采用1234的版本号来标注规范显得不太合适。所以从 ECMAScript 6 开始,就开始采用年号来做版本。即 ECMAScript 2015。

新的规范制定流程

在新的规范制定流程中,要求成文标准要从事实标准中诞生,实现先于标准存在,大家可以在接下来的流程说明中看出来。

每个新特性,从开始到完成一共要经历5个阶段。


strawman (稻草人)阶段


proposal(提案)阶段

  • TC39制定成员作为 champion
  • TC39审阅通过
  • 有实现的 Demo 或者 Polyfill
  • 初步描写标准的语义语法算法复杂度解决的问题等



Draft(草案)阶段

  • 有两个或两个以上的实现(包括babel这类的转译实现)
  • 使用正式的语言描述该语法,api等



candidate(候选)阶段

  • 至少2个实现,可以为实验性实现
  • ECMAScript spec editor 通过审核
  • TC39 review 通过
  • 文本编写完成



Finished(完成)阶段

  • 编写 test 262 测试用例
  • 通过两个实现该特性的内核测试
  • ECMAScript spec editor 通过审核
  • 开发者表示支持和认可



接下来,在每年的3月和9月,都会提交新特性的申请,在 ECMA General Assembly 通过以后,被添加到标准中去。

值得注意的是,TC39 每年的工作日程也是规划好了的。

每年的3月,TC39 会召开会议,将完成的特性添加到标准中。

每年的4月到6月,会由 ECMA CC 和 ECMA CG 来做 Review。

每年的7月,批准通过新标准并且发布。现在 ECMAScript 2016 和 2017 标准已经正式发布。当然了,因为现在的标准制定流程的变更,所以每次更新添加的新特性并不是很多。


ECMAScript 2016

在2016的版本里只新增了两个特性,用的人可能也不多,所以大家的关注度并不高。

  • Array.prototype.includes
  • Exponentiation Operator

这是两个很简单的特性,所以也不多做介绍了。

ECMAScript 2017

而在2017的版本里,有一个非常值得大家期待的新特性,那就是 async await。作为我们目前的异步终极解决方案,也是如大家所期望的正式进入标准。

还有一个很有说头的新方法,就是字符串填充。padstart 和 padend。为什么有说头呢,当初 node 圈发生的 leftpad 事件,我想大家也是有所耳闻的。这个方法正可以用来取代 leftpad。

其余的特性还有

  • Object.values/Object.entries
  • Trailing commas in function and json
  • Object.getOwnPropertyDescriptors
  • Shared memory and atomics


迷茫的新特性

对于有些人来说,前端的更新总是很突兀,很让人迷茫。

但是其实不是的。变化总是一点一点发生的。

GitHub - tc39/proposals: Tracking ECMAScript Proposals

我们可以在 TC39 的 Github 仓库中找到完成了,废弃的,以及正在进行中的提案。

多去关注这些东西,对于很多新事物的到来,我们也就不会有多惊讶了。

别的 ECMA 标准?

和 ECMAScript 有关的标准只有 ECMA262 吗?

其实不是。和 ECMAScript 有关的标准有 ECMA262,ECMA290,ECMA327,ECMA357,ECMA402,ECMA404,ECMA414等等。

其中290,327,357等等没有推广开来,被废弃。

ECMA 262 是语言规范本身。

ECMA 402 则是制定一些基于 ECMAScript 5 或者之后版本的一些国际化 API 标准。

ECMA 404 是 JSON 规范。

ECMA 414 则规定了哪些规范是和 ECMAScript 有关的。目前内部就包含了 262,402和404。


备注

如果大家想更好的关注标准的变化,可以订阅 TC39 的邮件组,关注 TC39 的 Github,并且在 Twitter 上关注 TC39 的成员。



引用

编辑于 2017-07-25