关于 JavaScript 标准
XXHolic opened this issue · comments
目录
想法
前不久在一次分享中,听到了关于 JavaScript 标准的内容,期间还提到了 Babel 对于标准的支持。后来在看 Babel 文档的时候,看了关于 preset 的设置,不同的取值对应了不同阶段的 JavaScript 特性,心里也有一些疑问,就顺便总结一下。
标准的历史
ECMAScript 1.0
1996 年 3 月,Navigator 2.0 浏览器正式内置了 JavaScript 脚本语言。
1996 年 8 月,微软模仿 JavaScript 开发了一种相近的语言,取名为 JScript(JavaScript 是 Netscape 的注册商标,微软不能用),首先内置于IE 3.0。Netscape 公司面临丧失浏览器脚本语言主导权的局面。
1996 年 11 月,Netscape 公司决定将 JavaScript 提交给欧洲计算机制造商协会 ECMA(European Computer Manufacturers Association),希望 JavaScript 能够成为国际标准,以此抵抗微软。该协会指定 39 号技术委员会(TC39,Technical Committee #39)负责“标准化一种通用、跨平台、供应商中立的脚本语言的语法和语义”。TC39 由来自 Netscape、Sun、微软、Borland 及其他关注脚本语言发展的公司的程序员组成。该委员会定期开会,所有的邮件讨论和会议记录,都是公开的。
1997 年 7 月,ECMA 组织发布 262 号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript(发音为“ek-ma-script”)。这个版本就是 ECMAScript 1.0。
ECMAScript 2.0
1998 年 6 月,ECMAScript 2.0 版发布。这个版本是为了解决 ECMA 和 ISO/IEC(International Organization for Standardization and International Electrotechnical Commission,国标标准化组织和国际电工委员会) 在 JavaScript 标准上的不一致性。JavaScript 语言本身并没有什么改动。这个版本里有趣的事情是:在编译时并没有捕获错误,而是留给解释器处理。这个是因为异常处理当时还不是语言的一部分。
ECMAScript 3.0
1999 年 12 月,ECMAScript 3.0 版发布,成为 JavaScript 的通行标准,得到了广泛支持。这使得 ECMAScript 3.0 成为许多库支持的最低版本。这是第一次重大的变动。这个版本引入的功能有:
- 正则表达式
do-while
模块- 异常处理和
try/catch
模块 - 字符串和数组更多的内置处理方法
- 数字输出格式化
in
和instanceof
操作符- 更好的错误处理
在这一年,还有一个很重要的事情发生,那就是 AJAX 的诞生,IE 5 部署了 XMLHttpRequest 接口,允许 JavaScript 发出 HTTP 请求,为后来大行其道的 AJAX 应用创造了条件。
ECMAScript 3.1 and 4.0
2007 年 10 月,ECMAScript 4.0 版草案发布,对 3.0 版做了大幅升级,预计次年 8 月发布正式版本。草案发布后,由于 4.0 版的目标过于激进,各方对于是否通过这个标准,发生了严重分歧。以 Yahoo、Microsoft、Google 为首的大公司,反对 JavaScript 的大幅升级,主张小幅改动;以 JavaScript 创造者 Brendan Eich 为首的 Mozilla 公司,则坚持当前的草案。
2008 年 7 月,由于对于下一个版本应该包括哪些功能,各方分歧太大,争论过于激进,ECMA 开会决定,中止 ECMAScript 4.0 的开发(即废除了这个版本),将其中涉及现有功能改善的一小部分,发布为 ECMAScript 3.1,而将其他激进的设想扩大范围,放入以后的版本,由于会议的气氛,该版本的项目代号起名为 Harmony(和谐)。会后不久,为了避免疑惑,将 ECMAScript 3.1 改名为 ECMAScript 5.0。
比较有意思的是,还是有公司实施了对 ECMAScript 4.0 的支持,那就是 Adobe 公司。ActionScript 作为 Flash 开发的脚本语言,就是基于 ECMAScript 4.0 早期草案设计。
ECMAScript 5.0
2009 年 12 月,ECMAScript 5.0 版 正式发布。ECMAScript 5.0 相对于 ECMAScript 3.0 是一个比较温和的更新,它包含有:
- Getter/setters
- 在数组和对象字面量中追踪逗号
- 保留字作为属性名
- 新的
Object
方法(例如 create, defineProperty, keys, seal, freeze, getOwnPropertyNames 等等) - 新的
Array
方法(例如 isArray, indexOf, every, some, map, filter, reduce 等等) String.prototype.trim
属性允许使用- 新的
Date
方法(toISOString, now, toJSON) bind
方法- JSON
- 不变的全局对象(undefined, NaN, Infinity)
- 严格模式
- 其它细节的改变(例如
parseInt
会忽略开头的0)
所有的更新都不需要语法改变。
Harmony 项目则一分为二,一些较为可行的设想定名为 JavaScript.next 继续开发,后来演变成 ECMAScript 6;一些不是很成熟的设想,则被视为 JavaScript.next.next,在更远的将来再考虑推出。TC39 的总体考虑是,ECMAScript 5 与 ECMAScript 3 基本保持兼容,较大的语法修正和新功能加入,将由 JavaScript.next 完成。当时,JavaScript.next 指的是ECMAScript 6。第六版发布以后,将指 ECMAScript 7。TC39 预计,ECMAScript 5 会在 2013 年的年中成为 JavaScript 开发的主流标准,并在此后五年中一直保持这个位置。
ECMAscript 5.1
2011 年 6 月,ECMAscript 5.1 版发布,并且成为 ISO 国际标准(ISO/IEC 16262:2011)。这个版本澄清了标准中的一些含糊不清的点,没有任何新的功能。到了 2012 年底,所有主要浏览器都支持 ECMAScript 5.1 版的全部功能。
ECMAScript 6
2015 年 6 月,ECMAScript 6 正式发布,并且更名为“ECMAScript 2015”。这是因为 TC39 委员会计划,以后每年发布一个 ECMAScript 的版本,下一个版本在2016年发布,称为”ECMAScript 2016”,2017年发布“ECMAScript 2017”,以此类推。这个版本有比较多的内容,具体的变动可见 ECMAScript 6 入门 或者 A Rundown of JavaScript 2015 features。
后续每年的变动都会在 github 上跟踪记录。具体见 github-tc39。
从 ES5 到 ES6 经历了 6 年,语言的变化比较大。为了避免剧烈的变动,从 ECMAScript 2016 开始,版本发布会变得更加频繁,但每次的变动会更小。想要纳入规范,必须要经历 The TC39 Process,下面就介绍相关的内容。
The TC39 Process
语言变动的发展是通过一个引导进化的过程:从一个想法到一个完整明确的特性,再到验收测试和多种实现。这里有 5 个阶段:一个“稻草人”阶段和 4 个“成熟”阶段。从一个阶段到下一个阶段的推进必须要经 TC39 批准。关于 Object.observe 提议的变化过程可以当作一个示例看看。
Stage 0:Strawman(稻草人)
这个阶段为了推进 ECMAScript 的发展,任何没有被正式提交过的,对于改变或者增加的讨论、想法和建议,都在这个阶段,这个阶段不需要审核标准。但只有 TC39 的成员才可以直接提交。如果不是成员也想提交,那么就要申请,具体见 Contributing to ECMAScript。
Stage 1:Proposal(提案)
这个阶段形成一个正式的特性提案。
进入这个阶段的标准:
- 指定 TC39 的成员成为这个提案的“带头人”
- 问题或者需求的大概描述,提供常规的解决方案
- 使用说明性的示例
- 高级别的 API
- 关键算法、抽象与语义的探讨
- 潜在的问题也必须要指出,例如和其它特性的相互作用,实现的挑战和复杂度
- 需要提供 demo 和 polyfills,这是比较明智的做法(可选)
Stage 2:Draft(草案)
这是规范的第一个版本。有可能进入到标准中。
进入这个阶段的标准:
- 符合以上阶段的标准
- 用规范的语言描述这个特性的语法和语义。描述要尽可能的完善,允许保留待定事项。
- 需要 2 个实验性的实现,其中一个要在一个转换器中,例如 babel(可选)。
Stage 3:Candidate(候选)
这个阶段提案主要部分已经完成,需要等待实施和用户的反馈。
进入这个阶段的标准:
- 符合以上阶段的标准
- 规范文档必须完成。
- 指定评审人已经在当前规范上签字。
- 所有的 ECMAScript 编辑已经在当前规范上签字。
- 必须要有至少 2 个符合规范的完整实现(默认情况下不一定必须要启用)
Stage 4:Finished(完成)
这个阶段已经准备好加入到标准中。
进入这个阶段的标准:
- 符合以上阶段的标准
- Test262 已经为主要使用场景编写了验收测试并已合并
- 两个通过验收测试的完整实现
- 重要的实际应用,例如两个独立的虚拟环境的支持,比如说 Babel的支持 (Significant in-the-field experience with shipping implementations, such as that provided by two independent VMs)
- 一个完整规范的文本的请求已经发送给 tc39/ecma262
- 所有的 ECMAScript 编辑已经在请求上签字
规范修订和安排
TC39 打算在每年的 7 月,向 ECMA 大会提交说明书审核。下面就是规范修订的大概时间线:
- 2 月 1 号:候选草案已经产生。
- 2 月-3 月:60 day royalty-free opt-out period(60天买断式授权自愿退出期)。
- March TC39 Meeting:第 4 阶段的建议被纳入,最终语义被批准,新版本的分支从 master 分支产生。从此刻起,只有编辑的改动允许被接受。
- 6 月-7 月:ECMA CC 和 ECMA GA 复查时期。
- 7 月:ECMA 大会批准新的标准。