XXHolic / blog

I wonder how~, I wonder why~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于 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 模块
  • 字符串和数组更多的内置处理方法
  • 数字输出格式化
  • ininstanceof 操作符
  • 更好的错误处理

在这一年,还有一个很重要的事情发生,那就是 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 大会批准新的标准。

参考资料