ECMAScript详细解读在github上有持续更新,欢迎阅览
ECMAScript-notes
此Ecma标准定义了ECMAScript 2021语言。它是ECMAScript语言规范的第12版。自从1997年第一版出版以来,ECMAScript已经发展成为世界上使用最广泛的通用编程语言之一。它被称为嵌入在web浏览器中的语言,但也被广泛应用于服务器和嵌入式应用程序。
ECMAScript基于几种原始技术,最著名的是JavaScript(Netscape)和JScript(Microsoft)。这种语言是由网景公司的Brendan Eich发明的,并首次出现在该公司的Navigator 2.0浏览器中。它出现在Netscape的所有后续浏览器中,以及从Internet Explorer 3.0开始的所有Microsoft浏览器中。
ECMAScript语言规范的编制始于1996年11月。本Ecma标准的第一版由Ecma大会于1997年6月通过。
该Ecma标准提交给ISO/IEC JTC 1以供采用,并于1998年4月批准为国际标准ISO/IEC 16262。Ecma大会于1998年6月批准了第二版Ecma-262,以使其与ISO/IEC 16262完全一致。第一版和第二版之间的改动本质上是编辑性的。
该标准的第三版引入了强大的正则表达式、更好的字符串处理、新的控制语句、try/catch异常处理、更严格的错误定义、数字输出的格式设置以及对未来语言增长的预期进行的微小更改。ECMAScript标准的第三版于1999年12月由Ecma大会通过,并于2002年6月作为ISO/IEC 16262:2002出版。
自第三版发布以来,ECMAScript 因其与万维网的关联而获得了广泛采用,它已经成为基本上所有Web浏览器都支持的编程语言。为开发ECMAScript的第四版做了大量的工作。但是,这项工作还没有完成,也没有作为ECMAScript的第四版出版,但是其中一些已经被纳入第六版的开发中。
ECMAScript的第五版(作为ECMA-262第五版发布)编写了对浏览器实现中常见的语言规范的解析,并增加了对第三版发布以来出现的新功能的支持。这些特性包括访问器属性、反射创建和对象检查、属性特性的程序控制、新增的数组操作函数、对JSON对象编码格式的支持以及提供增强的错误检查和程序安全性的严格模式。第5版被2009年12月的Ecma大会所采纳。
第五版被提交给ISO/IEC JTC 1,并且在2011年的ISO/IEC 16262:2011上被作为国际标准被通过。ECMAScript标准的5.1版包含了一些小的修改,并与ISO/IEC 16262:2011保持一致。第5.1版在2011年6月底Ecma大会上被采纳。
第六版的重点开发始于2009年,当时第五版正在筹备发布。然而,在这之前,大量的实验和语言增强设计工作可以追溯到1999年第三版的出版。实际上,第六版的完成是十五年努力的结果。这个版本的目标包括为大型应用程序提供更好的支持、库创建以及将ECMAScript用作其他语言的编译目标。它的一些主要增强包括模块、类声明、词法块级作用域、迭代器和生成器、异步编程的promise、解构模式和正确的尾部调用。扩展了ECMAScript内置库,以支持额外的数据抽象功能,包括map、set和TypedArray,以及对字符串和正则表达式中Unicode补充字符的额外支持。通过子类化,内置组件也可以扩展。第六版为规则、增量语言和库增强提供了基础。第六版于2015年6月由大会通过。
ECMAScript规范是Ecam TC39的第一个发布版,新的发布策略将会每年发布一次新版本,并且公布进展过程。纯文本源文档是根据ECMAScript 2015源文档构建的,作为完全基于GitHub的进一步开发的基础。在这个标准的开发过程中,提交了数百个pr和issu,修复了很多bug、编辑错误和其他改进。此外,还开发了许多软件工具来帮助这项工作,包括Ecmarkup、Ecmarkdown和Grammarkdown。ES2016还包括对新的求幂运算符的支持,并向Array.prototype添加了一个名为include的新方法。
ECMAScript 2017引入了异步函数、共享内存和原子,以及更小的语言和库增强、错误修复和编辑更新。异步函数通过为promise返回函数提供语法来改善异步编程体验。共享内存和原子技术引入了一种新的内存模型,该模型允许多代理程序使用原子操作进行通信,即使在并行CPU上也能确保定义良好的执行顺序。它还包括对象的新静态方法:Object.values, Object.entries, and Object.getOwnPropertyDescriptors.
ECMAScript 2018通过AsyncIterator协议和异步生成器引入了对异步迭代的支持。它还包括四个新的正则表达式特性:dotAll flag、命名捕获组、Unicode属性转义和查找断言。最后,它包括对象静止和扩散属性。
ECMAScript 2019引入了一些新的内置函数:Array.prototype上的flat和flatMap用于扁平化数组,Object.fromEntries用于将Object.entries的返回值直接转换为新的Object,以及String.prototype上的trimStart和trimEnd更好广泛实施作为非标准String.prototype.trimLeft和trimRight的名称替代。此外,它还对语法和语义进行了一些小的更新。更新的语法包括可选的catch绑定参数,并允许字符串文本中的U+2028(行分隔符)和U+2029(段落分隔符)与JSON对齐。其他更新包括要求Array.prototype.sort做一个稳定的排序,需要JSON.stringify返回格式良好的UTF-8,而不考虑输入,并澄清Function.prototype.toString函数要求它返回相应的原始源文本或标准占位符。
ECMAScript 2020(第11版)引入了用于字符串的matchAll方法,以为全局正则表达式生成的所有匹配对象生成一个迭代器。 import(),一种使用动态说明符异步导入模块的语法; BigInt,,一种用于处理任意精度整数的新数字原语, Promise.allSettled, 一种新的不短路的Promise组合器,globalThis,访问全局this值的通用方法;用于模块语法的export * as ns from 'module';for-in加强枚举顺序的标准化; import.meta,模块中可用的主机填充对象,可能包含有关模块的上下文信息; 以及添加了两个新的语法功能以改善对“nullish”值(null or undefined)的处理:nullish,值选择运算符; 以及可选的链接,这是一个属性访问和函数调用运算符,如果访问/调用的值为nullish,则该运算符会短路。
几十位代表许多组织的个人在Ecma TC39中为本版本和以前版本的开发做出了非常重要的贡献。此外,一个充满活力的社区已经出现,支持TC39的ECMAScript工作。这个社区已经审阅了大量的草稿,提交了数千个bug报告,执行了实现实验,提供了测试套件,并向世界各地的开发人员社区介绍了ECMAScript。遗憾的是,不可能确定和承认为这项努力作出贡献的每一个人和组织。
Allen Wirfs-Brock
ECMA-262, Project Editor, 6th Edition
Brian Terlson
ECMA-262, Project Editor, 7th through 10th Editions
Jordan Harband
ECMA-262, Project Editor, 10th through 12th Editions