ECMAScript 简介

ECMA简介

Ecma International是一家总部位于瑞士的非营利性协会,于1961年5月17日正式成立,是一家国际性会员制度的信息和电信标准组织,在欧洲制造、销售或开发计算机和电信系统的公司都可以申请成为会员。1994年之前,名为欧洲计算机制造商协会(European Computer Manufacturers Association)。因为计算机的国际化,组织的标准牵涉到很多其他国家,因此组织决定改名表明其国际性。现名称已不属于首字母缩略字,但保留了商标”Ecma”。其总部位于日内瓦,靠近其他标准制定组织的总部,例如国际电工委员会(IEC),国际标准化组织(ISO,涉及领域更为广泛,比如质量标准、安全标准、管理标准等)和国际电信联盟(ITU)。

ECMA国际的任务包括与有关组织合作开发通信技术和消费电子标准、鼓励准确的标准落实、和标准文件与相关技术报告的出版。涵盖了硬件,软件,通信,消费电子,媒体,存储和环境等相当广泛的标准化主题。

技术工作由技术委员会(TC)和任务组(TG)进行。技术委员会或任务组处理特定领域或主题(例如编程语言)。

编程语言是用于指示计算机或计算设备执行特定任务的词汇和语法规则集,由TC39(ECMAScript),TC49(C#,CLI,Eiffel)和TC52(Dart)开发。

其中负责制定ECMAScript标准的TC39还下分了两个任务组:TG1,TG2,分别负责ECMA-262标准,ECMA-402标准。

  • TG1的主要任务是负责通用,跨平台,与供应商无关的编程语言ECMAScript(JavaScript)的标准化(ECMA-262)。包括语言本身的语法,语义,库和支持该语言的补充技术。
  • TG2的主要工作或者说ECMA-402标准的主要内容是定义一系列需要适应不同人类语言和国家所使用的语言和文化惯例的ECMAScript对象的应用程序编程接口

ECMAScript简介

ECMAScript是由网景(Netscape)通信公司的布兰登·艾克开发的一种脚本语言的标准化规范;最初命名为Mocha,后来改名为LiveScript,最后重新命名为JavaScript。1995年12月,升阳与网景联合发表了JavaScript。1996年11月,网景公司将JavaScript提交给欧洲计算机制造商协会(Ecma)进行标准化。ECMA-262的第一个版本于1997年6月被Ecma组织采纳。ECMAScript是由ECMA-262标准化的脚本语言的名称。

尽管JavaScript和JScript(微软实现的用于低版本IE的脚本语言,主要区别在于DOM部分)与ECMAScript相容,但包含超出ECMAScript的功能。可以通俗地认为JS是ECMAScript的实现与扩展,ECMAScript是JS的标准与规范。

任何人都可以参与ECMAScript标准的建议与修改,但必须经过五个阶段,每个阶段的递进都由TC39审阅评判:

阶段名称目的或结果
stage 0Strawperson(意向阶段)允许输入规范,收集意向
stage 1Proposal(提议阶段)提出允许添加的理由或案例,描述方案,确认潜在的挑战
stage 2Draft(草案阶段)用形式化语言(用精确的数学或机器可处理的公式定义的语言)精确描述其语法和语义
stage 3Candidate(候选阶段)收集来自用户或者其它实施过程带来的(比如浏览器厂商等)的反馈信息,指出进一步的改进
stage 4Finished(定案阶段)表明添加的内容已准备好包含在正式的ECMAScript标准中

ECMAScript标准迭代历史

时间版本变化
1996.11-1997.06ECMA-262 1st edition该ECMA标准提交给ISO/IEC JTC 1
-1998.06ECMA-262 2nd edition基本没什么变化,仅仅是编辑整理使其与ISO/IEC 16262标准一致
-1999.12ECMA-262 3rd edition引入了强大的正则表达式、更好的字符串处理、新的控制语句、try/catch异常处理、更严格的错误定义、数字输出格式以及对未来语言增长的微小更改。该版标志着ECMAScript成为了一门真正的编程语言,一门基本上所有Web浏览器都支持的编程语言,为第四版的开发作了大量工作
-2008.07ECMA-262 4th edition(不存在)该版本在08年7月发布前夭折了,被完全废弃,其中一些内容被纳入了第六版的开发中
-2009.12ECMA-262 5th edition编纂了事实上对浏览器实现中常见的语言规范的解释(澄清歧义),并增加了对自第三版出版以来出现的新功能的支持:包括访问器属性、对象的创建和检查、属性的内部属性的程序控制(defineProperty等)、额外的数组操作方法、对JSON对象编码格式的支持以及提供增强错误检查和程序安全性的严格模式。
-2011.06ECMA-262 5.1th edition包含了细微的修改,被批准为国际标准ISO/IEC 16262:2011,后称es5
-2015.06ECMA-262 6th edition该版重点发展始于2009年,因为第五版正在准备出版。然而,这之前的重大实验和语言增强设计的努力可以追溯到1999年出版的第三版。真实意义上说,第六版的完成是十五年努力的结晶。这个版本的目标包括更好地支持大型应用程序、创建库以及将ECMAScript用作其他语言的编译目标。它的一些主要扩展包括模块、类声明、块作用域、迭代器和生成器、异步编程promise、解构模式和适当的尾部调用。ECMAScript内置库被扩展以支持额外的数据抽象,包括二进制数值的映射、集合和数组,以及对字符串和正则表达式中的Unicode补充字符的额外支持。实例也可以通过子类进行扩展。该版为规范化增量语言和库扩展提供了基础,后称es6或es2015
-2016.06ECMA-262 7th edition该版为根据Ecma TC39新的年度发布节奏和开放开发流程发布的第一个ECMAScript版本。在这个标准的开发过程中,提交了数百个pull请求和问题,代表了数千个bug修复、编辑修复和其他改进。此外,开发了许多软件工具来帮助这项工作,包括Ecmarkup(理解为自定义html标签)、Ecmarkdown和Grammarkdown。ES2016还包括对新的求幂运算符(**)的支持,并为数组的原型添加includes方法。
-2017.06ECMA-262 8th edition该版引入了异步函数(async/await)、共享内存(Web Worker)和Atomics对象(为线程通信提供一系列方法)。异步函数通过为promise返回函数提供语法来改善异步编程体验。共享内存和Atomics引入了一种新的内存模型,允许多个线程使用Atomics操作进行通信,即使在并行cpu上,Atomics操作也能确保定义良好的执行顺序。它还包括对象的新静态方法:Object.values, Object.entries,和Object.getOwnPropertyDescriptors.
-2018.06ECMA-262 9th edition该版本通过AsyncIterator协议和异步生成器引入了对异步迭代的支持(for wait of)。它还包括四个新的正则表达式特性:dotAll标志(sflag,解决.字符对换行符\n回车符\r不匹配问题)、命名捕获组(解决日期表示法不统一问题)、Unicode属性转义(例如用\p{Number}匹配所有的Unicode数字)和look-behind(后行断言)。最后,它包括对象扩展属性(对象rest写法)。
-2019.06ECMA-262 10th edition该版本引入了一些新的内置函数:flat(数组降维)和flatMapmap + flat)。Object.fromEntriesObject.entries为互逆操作,trimStarttrimEnd字符串原型方法作为广泛实施但非标准的更好的替代方案(代替trimLefttrimRight)。此外,它还对语法和语义进行了一些小的更新:更新的语法包括可选的catch绑定参数(catch方法可以不需要传入参数),并允许字符串文本中的U+2028(行分隔符)和U+2029(段落分隔符)与JSON一致(待补充解释)。其他更新包括要求Array.prototype.sort必须是稳定排序,要求JSON.stringify返回格式良好的UTF-8而不考虑输入(超出Unicode范围输出转义序列,原先会直接输出字符串),并应需澄清Function.prototype.toString返回相应的原始源文本或标准占位符(包含注释及空格等)。
-2020.06ECMA-262 11th edition该版本引入了字符串的matchAll方法,为全局正则表达式生成的所有匹配对象生成迭代器;import(),一种使用动态说明符异步导入模块的语法;BigInt,一种用于处理任意精度整数的新数字原语(末尾加个n,不限制位数);Promise.allSettled, 一个新的不短路的Promise组合器(解决promise.all因某个请求失败导致整体无法渲染的问题,还能获取到所有请求的结果数组);globalThis,一种访问全局this值的通用方法;export * as ns from 'module',模块内专用语法,先引入再导出(并非真正引入);for-in循环顺序的标准化;import.meta, 返回一个对象,只能在模块内部使用,可能包含有关模块的上下文信息(例如当前模块的url);以及添加两个新的语法特性以改进对“空”值(空或未定义)的处理:空合并,值选择运算符(??,例:0 ?? 'hello'返回0);和可选链接(?.,例user?.name,user信息为空时返回undefined而非报错),一种属性访问和函数调用运算符,当要访问/调用的值为空时,该运算符会短路。(非常有用的特性,用了以后再也不会出现无法预料的can't read property '**' of undefined/null

文中不足之处请指正。

参考文献

[1] https://www.iso.org/[EB/OL].ISO
[2] https://www.ecma-international.org/[EB/OL].ecma
[3] ECMAScript[EB/OL].维基百科,2021-02-14.
[4] TC39.https://tc39.es/process-document/[EB/OL].https://tc39.es
[5] https://262.ecma-international.org/11.0/#sec-intro[EB/OL].ecma