vlambda博客
学习文章列表

全网最全 ECMAScript 攻略

作为前端开发工程师,ES6 这个词想必不陌生,对 ECMAScript 这个奇怪发音的名字也应该有所了解,你是否好奇过 ECMA 世界的神秘数字代号,ECMA-262 是什么,ESxxx 又是什么,TC39 是什么,Stage 3 、Stage 4 又意味着什么?你是否被层出不穷的 ES20XX 新特性所迷惑,需要掌握该特性到底是哪年推出的吗,这些提案在哪里能够看到,哪些已经可用,历年的 ES 标准去哪里查找?今天我来带大家揭开 ECMAScript 的神秘面纱,彻底理解掌握这些神秘代号,以及截止到 2021 年 ECMAScript 的特性。

另:祝贺我国首个 JS 语言提案在 ECMA 进入 Stage 3。

ECMAScript 历史

我们首先来看 ECMA 是什么。ECMA,读音类似“埃科妈”,是欧洲计算机制造商协会(European Computer Manufacturers Association)的简称,是一家国际性会员制度的信息和电信标准组织。1994 年之后,由于组织的标准牵涉到很多其他国家,为了体现其国际性,更名为 Ecma 国际(Ecma International),因此 Ecma 就不再是首字母缩略字了。

Ecma International

了解了这段历史,为了技术写的专业性,如果文章中提到 Ecma 的时候,可以写成 Ecma 或者 ecma,不要写成 ECMA,除非是 ECMAScript 或 ECMA-XXX 这类专有名词。

1995 年,著名的网景公司(Netscape)的 Brendan Eich 开发了一种脚本语言,最初命名为 Mocha,后来改名为 LiveScript,最后为了蹭当时火热的 Java 热度重命名为了 JavaScript。

了解了 Ecma 国际和 JavaScript,就方便了解 ECMAScript 了,ECMAScript 是一种由 Ecma 国际在标准 ECMA-262 中定义的 脚本语言 规范。这种语言在往往被称为 JavaScript 或 JScript ,但实际上 JavaScript 和 JScript 是 ECMA-262 标准的实现和扩展。

神秘的 ECMA-262

上文提到了第一个神秘代码 ECMA-262,ECMA-262 到底是什么呢?原来 Ecma 国际的标准,都会以 Ecma-Number 命名,ECMA-262 就是 ECMA 262 号标准,具体就是指 ECMAScript 遵照的标准。1996 年 11 月,网景公司将 JavaScript 提交给 Ecma 国际进行标准化。ECMA-262 的第一个版本于 1997 年 6 月被 Ecma 国际采纳。

尽管 JavaScript 和 JScript 与 ECMAScript 兼容,但包含超出 ECMAScript 的功能。

我们如何查看最新最全的 Ecma 标准呢,可以查看 Ecma 国际官网的 Standards。截止到 2021 年 4 月,最新的 Ecma 标准已经到了 ECMA-418。

全网最全 ECMAScript 攻略

Ecma 标准涉及的类别非常多,官网因此提供了按照类别和最新修改排序的功能,我们来看看 ECMA-262 属于哪个类别:

全网最全 ECMAScript 攻略

ECMA-262 属于“软件工程与接口”类别,该类别一共有 12 个标准,详见上图。注意,ECMA-262 的最新更新日期是 2020 年 6 月,并且会在今年 6 月进行更新,更新之后,ES2021 就会成为 ECMA 标准。

探秘 Ecma TC39 神秘组织

揭开了 Ecma-262 神秘面纱之后,我们来探秘一个代号名为 TC39 的神秘组织。

全网最全 ECMAScript 攻略
Ecma TC39

其实官网解释的已经很清楚了,我用中文简要概括下:

TC39 是 Technical Committee 39 的简称,是制定 ECMAScript 标准的委员会,由各个主流浏览器厂商的代表构成,主席团三人分别来自 PayPal、Bloomberg 和 Microsoft,下设两个工作组(task group) TC39-TG1  和  TC39-TG2 。

TC39-TG1 工作组主要工作是通用 ECMAScript® 语言, 包括语法、语义、类库以及支持该语言的技术。

TC39-TG2 工作组 ECMAScript® 国际化 API 标准。

我们经常会看到类似的新闻:XX 公司成为 Ecma TC39 成员。想要加入 TC39 会议,必须先成为 Ecma 会员:

全网最全 ECMAScript 攻略

那 Ecma 到底有哪些成员呢?Ecma 官网给出了答案:

全网最全 ECMAScript 攻略

几大巨头赫然在列!看到这里,发现一共有 5 种类别,分别是 Ordinary members、Associate members、SME members、SPC members、NFP members,我们来看 Ordinary members 和 Associate members 的对比:

全网最全 ECMAScript 攻略

Associate members 没有 Ecma 大会(General Assembly)的投票权!在 Associate members 中,我国的阿里巴巴、华为、腾讯、360 赫然在列。

Wait,CHF 70000,这是 70000 法郎?Ecma 果然是欧洲豪门,顶级会员年费接近 50 万人民币。算了一下 Ecma 国际会员费收入每年就有 1,134,000 法郎,约 800 万人民币。

全网最全 ECMAScript 攻略
08-member-fee-all.png

了解更多关于 TC39 的内容,可以探索其官网 TC39 – Specifying JavaScript. 和 GitHub 仓库 Ecma TC39 · GitHub,注意这个仓库很重要。查看一下 members,发现了 月影、李松峰 和 元彦 三位国内大佬。

我们熟悉的 ES6

探究完神秘的 ECMA-262 和 TC39 之后,我们缓口气,来看看我们最为熟悉的 ESX 家族。

上文提到 ECMAScript 是由 Ecma 国际在标准 ECMA-262 中定义的脚本语言规范。到 2015 年,一共发布了 1、2、3、4、5、5.1、6 共 7 个版本(其中 4 被废弃)。

我们常把 5.1 之前的 ECMAScript 版本统称做 ES5,将 6 版本之后的版本统称做 ES6(因为从 2015 年起,ECMAScript 终于步入正轨,每年发布一次版本,到了 2021 年,已经发布了 6 个版本了,实在太多,所以用变革了 JavaScript 时代的 ES6 作为后续版本的代称)。

划重点,Web 前端招聘的 JD 中,经常出现的 ES6,不仅仅是 ES2015 这个版本,而是指代 ES2015 和其后每年发布的 ECMAScript 版本。

从 ECMAScript 第 6 版开始,每年发布一个 ECMAScript 版本,因此 ECMAScript 版本有了很多名字,包括全名 ECMAScript 6、简写 ES6、年份命名 ECMAScript 2015、年份简写 ES2015。最常见的名字还是 ES6,之后推出的 ES7、ES8 等同理。


需要注意的是,自从 TC39 进程 制定以来,ECMAScript 版本的重要性就降低了很多。大家不必记住某一个 ES 特性到底是哪年推出的。现在真正重要的是提案处于哪个阶段:一旦提案到了第 4 阶段,那么它就可以使用了。但是即使这样,你仍然需要检查你的引擎是否支持该功能。

这里又提到了一个 TC39 进程 和阶段(Stage)的概念,我们接下来看看这两个概念是什么含义。

TC39 进程和 Stage X

TC39 进程 故名思义,肯定是 TC39 组织发布的一个进程。随着 ECMAScript 6 的发布,当时的发布流程出现了两个明显的问题:

  • 如果在两个 release 之间多次通过早已准备好的功能,势必在其 release 之前等待很长一段时间。而且功能准备如果很晚,会增加 deadline 之前匆忙赶工的风险。
  • 很多功能在其实现和使用之前就花了很长时间在设计上,发现与实现和使用相关的设计缺陷会非常晚。

为了解决上述问题, TC39 建立了新的 TC39 进程:

  • ECMAScript 功能设计与每年的 ECMAScript 版本发布独立,使用不同阶段(Stage)来区分功能的状态,共 5 个阶段,从 Stage 0(strawman)开始,到 Stage 4 (finished)结束。
  • 越往后的阶段,需要原型实现和真机测试,可以建立设计和实现之间的反馈机制。
  • ECMAScript 版本 每年发布一次,发布的内容包含在 release deadline 之前的全部到达 Stage 4 的功能。

  • Stage 0:代号“稻草人(strawman)”,草案阶段
  • Stage 1:代号“提案(proposal)”, TC39 帮助阶段
  • Stage 2:代号“草案(draft)”, 本阶段很有可能成为标准
  • Stage 3:代号“候选(candidate)”, 已完成,需要从实现中获得反馈
  • Stage 4:代号“结束(finished)”, 准备成为标准

理解了 Stage 各阶段的含义,就能理解我国首个 JS 语言提案在 ECMA 进入 Stage 3这个新闻的意义了。

如何查看各阶段的提案呢?可以查阅 GitHub - tc39/ecma262: Status, process, and documents for ECMA-262 这个 repo。

历届 ES 特性全收录 ES2016 - ES2022

网上有太多零散的 ES 特性总结,很多同学想知道,有官方的 ECMAScript 功能列表吗?

当然有,TC39 仓库列出了  已完成提案  以及它们的版本。

虽然 6 年过去,但是新增的 ES 功能其实并不多,截至 2021 年 4 月 23 日,包括草案的功能,一共 39 个:

ES2016

  • Array.prototype.includes

    • 作者:Domenic Denicola
    • 维护者:Domenic Denicola、Rick Waldron
    • TC39 会议记录:November 2015
    • 发布时间:2016
  • Exponentiation operator

    • 作者:Rick Waldron
    • 维护者:Rick Waldron
    • TC39 会议记录:January 2016
    • 发布时间:2016

ES2017

  • Object.values/Object.entries

    • 作者:Jordan Harband
    • 维护者:Jordan Harband
    • TC39 会议记录:March 2016
    • 发布时间:2017
  • String padding

    • 作者:Jordan Harband
    • 维护者:Jordan Harband、Rick Waldron
    • TC39 会议记录:May 2016
    • 发布时间:2017
  • Object.getOwnPropertyDescriptors

    • 作者:Jordan Harband、Andrea Giammarchi
    • 维护者:Jordan Harband、Andrea Giammarchi
    • TC39 会议记录:May 2016
    • 发布时间:2017
  • Trailing commas in function parameter lists and calls

    • 作者:Jeff Morrison
    • 维护者:Jeff Morrison
    • TC39 会议记录:July 2016
    • 发布时间:2017
  • Async functions

    • 作者:Brian Terlson
    • 维护者:Brian Terlson
    • TC39 会议记录:July 2016
    • 发布时间:2017
  • Shared memory and atomics

    • 作者:Lars T Hansen
    • 维护者:Lars T Hansen
    • TC39 会议记录:January 2017
    • 发布时间:2017

ES2018

  • Lifting template literal restriction

    • 作者:Tim Disney
    • 维护者:Tim Disney
    • TC39 会议记录:  March 2017
    • 发布时间:2018
  • s (dotAll) flag for regular expressions

    • 作者:Mathias Bynens
    • 维护者:Brian Terlson、Mathias Bynens
    • TC39 会议记录:November 2017
    • 发布时间:2018
  • RegExp named capture groups

    • 作者:Gorkem Yakin、Daniel Ehrenberg
    • 维护者:Daniel Ehrenberg、Brian Terlson、Mathias Bynens
    • TC39 会议记录:November 2017
    • 发布时间:2018
  • Rest/Spread Properties

    • 作者:Sebastian Markbåge
    • 维护者:Sebastian Markbåge
    • TC39 会议记录:January 2018
    • 发布时间:2018
  • RegExp Lookbehind Assertions

    • 作者:Gorkem Yakin、Nozomu Katō、Daniel Ehrenberg
    • 维护者:Daniel Ehrenberg、Mathias Bynens
    • TC39 会议记录:January 2018
    • 发布时间:2018
  • RegExp Unicode Property Escapes

    • 作者:Mathias Bynens
    • 维护者:Brian Terlson、Daniel Ehrenberg、Mathias Bynens
    • TC39 会议记录:January 2018
    • 发布时间:2018
  • Promise.prototype.finally

    • 作者:Jordan Harband
    • 维护者:Jordan Harband
    • TC39 会议记录 :January 2018
    • 发布时间:2018
  • Asynchronous Iteration

    • 作者:Jordan Harband
    • 维护者:Jordan Harband
    • TC39 会议记录 :January 2018
    • 发布时间:2018

ES2019

  • Optional catch binding

    • 作者:Michael Ficarra
    • 维护者:Michael Ficarra
    • TC39 会议记录 :May 2018
    • 发布时间:2019
  • JSON superset

    • 作者:Richard Gibson
    • 维护者:Mark Miller、Mathias Bynens
    • TC39 会议记录:May 2018
    • 发布时间:2019
  • Symbol.prototype.description

    • 作者:Michael Ficarra
    • 维护者:Michael Ficarra
    • TC39 会议记录:November 2018
    • 发布时间:2019
  • Function.prototype.toString revision

    • 作者:Michael Ficarra
    • 维护者:Michael Ficarra
    • TC39 会议记录:November 2018
    • 发布时间:2019
  • Object.fromEntries

    • 作者:Darien Maillet Valentine
    • 维护者:Jordan Harband、Kevin Gibbons
    • TC39 会议记录:January 2019
    • 发布时间:2019
  • Well-formed JSON.stringify

    • 作者:Richard Gibson
    • 维护者:Mathias Bynens
    • TC39 会议记录:January 2019
    • 发布时间:2019
  • String.prototype.{trimStart,trimEnd}

    • 作者:Sebastian Markbåge
    • 维护者:Sebastian Markbåge、Mathias Bynens
    • TC39 会议记录:January 2019
    • 发布时间:2019
  • Array.prototype.{flat,flatMap}

    • 作者:Brian Terlson、Michael Ficarra、Mathias Bynens
    • 维护者:Brian Terlson、Michael Ficarra
    • TC39 会议记录:January 2019
    • 发布时间:2019

ES2020

  • String.prototype.matchAll

    • 作者:Jordan Harband
    • 维护者:Jordan Harband
    • TC39 会议记录:March 2019
    • 发布时间:2020
  • BigInt

    • 作者:Daniel Ehrenberg
    • 维护者:Daniel Ehrenberg
    • TC39 会议记录:June 2019
    • 发布时间:2020
  • Promise.allSettled

    • 作者:Jason Williams、Robert Pamely、Mathias Bynens
    • 维护者:Mathias Bynens
    • TC39 会议记录:July 2019
    • 发布时间:2020
  • globalThis

    • 作者:Jordan Harband
    • 维护者:Jordan Harband
    • TC39 会议记录:October 2019
    • 发布时间:2020
  • for-in mechanics

    • 作者:Kevin Gibbons
    • 维护者:Kevin Gibbons
    • TC39 会议记录:December 2019
    • 发布时间:2020
  • Optional Chaining

    • 作者:Gabriel Isenberg、Claude Pache、Dustin Savery
    • 维护者:Gabriel Isenberg、Dustin Savery、Justin Ridgewell、Daniel Rosenwasser
    • TC39 会议记录:December 2019
    • 发布时间:2020
  • Nullish coalescing Operator

    • 作者:Gabriel Isenberg
    • 维护者:Gabriel Isenberg、Justin Ridgewell、Daniel Rosenwasser
    • TC39 会议记录:December 2019
    • 发布时间:2020
  • import.meta

    • 作者:Domenic Denicola
    • 维护者:Gus Caplan
    • TC39 会议记录:March 2020
    • 发布时间:2020

ES2021

  • String.prototype.replaceAll

    • 作者:Peter Marshall、Jakob Gruber、Mathias Bynens
    • 维护者:Mathias Bynens
    • TC39 会议记录:June 2020
    • 预计发布时间:2021
  • Promise.any

    • 作者:Mathias Bynens、Kevin Gibbons、Sergey Rubanov
    • 维护者:Mathias Bynens
    • TC39 会议记录:July 2020
    • 预计发布时间:2021
  • WeakRefs

    • 作者:Dean Tribble、Sathya Gunasekaran
    • 维护者:Dean Tribble、Mark Miller、Till Schneidereit、Sathya Gunasekaran、Daniel Ehrenberg
    • TC39 会议记录:July 2020
    • 预计发布时间:2021
  • Logical Assignment Operators

    • 作者:Justin Ridgewell
    • 维护者:Justin Ridgewell、Hemanth HM
    • TC39 会议记录:July 2020
    • 预计发布时间:2021
  • Numeric separators

    • 作者:Sam Goto、Rick Waldron
    • 维护者:Sam Goto、Rick Waldron、Leo Balter
    • TC39 会议记录:July 2020
    • 预计发布时间:2021

ES2022

  • Class Fields ( Private instance methods and accessors ,  Class Public Instance Fields & Private Instance Fields ,  Static class fields and private static methods )
    • 作者:Daniel Ehrenberg
    • 维护者:Daniel Ehrenberg、Kevin Gibbons
    • TC39 会议记录:April 2021
    • 预计发布时间:2022

结语

授人以鱼,不如授人以渔,希望通过本文追根溯源,带领同学们走进 ECMAScript 的世界,ES 神秘代码不再神秘,ES 新特性不再彷徨。

参考资料

  • Ecma国际 - 维基百科,自由的百科全书
  • History and evolution of JavaScript
  • 【译】ECMAScript 2021: 最终功能集确定


往期推荐