本文为《人人都能读标准》—— ECMAScript篇的第2篇。我在这个仓库中系统地介绍了标准的阅读规则以及使用方式,并深入剖析了标准对JavaScript核心原理的描述。
1997年,一台名为“深蓝”的电脑,在国际象棋上击败了世界冠军卡斯帕罗夫,这是人类历史上首次在与计算机的智力较量上败下阵来。
1997年,一只名为“多利”的绵羊,在苏格兰的某个实验室里“出生”了,这是人类历史上第一只成功克隆的哺乳动物。
还是1997年,一部名为“ECMAScript”的语言标准悄然发布,随后的20年,JavaScript成为了彻底颠覆人类生活方式的互联网所使用的核心脚本语言。
本节,我将为你展示ECMAScript的演化历程 —— 诞生、迭代方式、迭代历史以及历史遗留问题。
在讲迭代方式的过程中,我会使用一个实际的例子,给你“可视化”一个新的语言特性是如何“百炼成钢”才进入标准的;本节的最后部分,我会为你展示如何使用标准提供的test262测试包自测自家浏览器对标准的实现程度,而对于那些未实现的部分,我们都有哪些主要的应对方案。
标准的诞生:为什么叫ECMAScript?
ECMAScript was always an unwanted trade name that sounds like a skin disease. —— Brendan Eich
ECMAScript一直是一个不受欢迎的商用名,听起来就像是一种皮肤病。 —— 布兰登·艾克
也许你跟我有过同样的困惑,即然ECMAScript标准是JavaScript的规范,为什么不干脆直接叫“JavaScript”?
我们可以从ECMAScript标准的诞生过程找到答案。
1995年,网景公司的一名工程师布兰登·艾克(Brendan Eich)用十天的时间创造了一门可以在浏览器上运行的脚本语言,这个语言最初命名为“Mocha”,然后改为“LiveScript”,最后决定为“JavaScript”。
1996年,微软发布了他们自己版本的JavaScript,叫JScript,JScript可以在微软的IE3上运行。
为了避免一场脚本语言的战争,1997年,网景公司找到欧洲计算机制造商协会(European Computer Manufacturers Association,简称ECMA) 来标准化JavaScript。在网景和微软的各种争论与妥协下,最终决定以「ECMAScript」来命名JavaScript的标准,即便布兰登老爷子觉得这听起来就像是一种皮肤病。
ECMA协会以ECMA-262编号ECMAScript标准,并任命tc39技术委员会负责制定这份标准。
随后,ECMAScript就开始了自己的野蛮生长。从1997年第一版ECMAScript的发布,到我编写这本书的时候,ECMAScript已经出到第14版了,并成为了世界上最多人使用的通用编程语言之一。
在本书,ECMAScript与JavaScript会交替使用,它们表达的都是同一个意思。
标准的迭代流程
从es6往后开始,ECMAScript标准就开源了它的开发流程。它在github上新建了一个仓库,任何人都可以在这里提交语言的bug、标准中的表达错误以及其他优化的内容。
ECMA协会还标准化了语言的迭代流程:
任何人都可以以任何形式提出增加或修改语言特性的提议;对于那些社区中反响热烈、有潜力的提议,tc39技术委员会的人会将其提交为一个提案(proposals),并进入正式的开发流程(process)。这个流程会对提案的内容进行问题建模、构建解决方案、识别潜在风险、收集社区反馈、编写规范文本、开发测试用例等等一系列的过程。整个流程会拆分为4个阶段(stage),每一个阶段的完成度以及审核的严格程度都不断提升,只有进入stage4最终阶段的提案才可以进入标准,从stage1到stage4往往需要数年时间。
每年7月份,ECMA协会就会正式发布新一版的标准,新的标准会把过去一年中进入stage4的提案集成进标准当中。
这有点类似于奥运会参赛选手的选拔过程:教练团队会把在全国各地发现的好苗子带到一个地方,并对这些好苗子进行科学的、严格的、规范的训练,而只有那些最终通过所有测试的运动员,才有资格参加奥运会。
你可以在这里看到4个stage分别的要求以及工作内容,我不打算干巴巴地给你翻译这些内容。在这里,我会以一个在2021年进入stage4、并最终进入es2022标准的提案 —— class静态块,作为例子,为你更加生动地呈现这4个阶段。
// class静态块示例:
class C {
static {
// ...
}
}
关于class静态块提案的历史发展,你可以从它的github仓库commit历史中找到详细的记录,每个stage的commit节点我已经为你找出来了: