ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] # ES5, ES6, ES2016, ES.Next: JavaScript 的版本是怎么回事? ![](https://box.kancloud.cn/d3d962cedaeeb237599d74607af3dbf6_428x252.png) ## JavaScript 有着很奇怪的命名史。 1995 年,它作为网景浏览器(Netscape Navigator)的一部分首次发布,网景给这个新语言命名为 LiveScript。一年后,为了搭上当时媒体热炒 Java 的顺风车,临时改名为了 JavaScript(*当然,Java 和 JavaScript 的关系,就和雷锋和雷锋塔一样 —— 并没有什么关系*) ![歪果仁的笑话怎么一点都不好笑](https://box.kancloud.cn/1b38367de09630cf3a45607d48d8ad6b_633x360.png) > 译者注:[wikipedia 的 JavaScript 词条](https://en.wikipedia.org/wiki/JavaScript#History)更详细的叙述了这段历史 1996 年,网景将 JavaScript 提交给 ECMA International(欧洲计算机制造商协会)](ECMA International(欧洲计算机制造商协会))进行标准化,并最终确定出新的语言标准,它就是 ECMAScript。自此,ECMAScript 成为所有 JavaScript 实现的基础,不过,由于 JavaScript 名字的历史原因和市场原因(很显然 ECMAScript 这个名字并不令人喜欢……),**现实中我们只用 ECMAScript 称呼标准,平时都还是使用 JavaScript 来称呼这个语言**。 > 术语(译者注): > * 标准(Standard): 用于定义与其他事物区别的一套规则 > * 实现(Implementation): 某个标准的具体实施/真实实践 不过,JavaScript 开发者们并不怎么在乎这些,因为在诞生之后的 15 年里,ECMAScript 并没有多少变化,而且现实中的很多实现都已经和标准大相径庭。其实在第一版的 ECMAScript 发布后,很快又跟进发布了两个版本,但是自从 1999 年 ECMAScript 3 发布后,十年内都没有任何改动被成功添加到官方规范里。取而代之的,是各大浏览器厂商们争先进行自己的语言拓展,web 开发者们别无选择只能去尝试并且支持这些 API。即使是在 2009 年 ECMAScript 5 发布之后,仍然用了数年这些新规范才得到了浏览器的广泛支持,可是大部分开发者还是写着 ECMAScript 3 风格的代码,并不觉得有必要去了解这些规范。 > 译者注:[ECMAScript 第四版草案](https://en.wikipedia.org/wiki/ECMAScript#4th_Edition_.28abandoned.29)由于太过激进而被抛弃,Adobe 的[ActionScript 3.0](https://en.wikipedia.org/wiki/ActionScript)是 ECMAScript edition 4 的唯一实现( Flash 差点就统一 Web 了) 到了 2012 年,事情突然开始有了转变。大家开始推动停止对旧版本 IE 浏览器的支持,用 ECMAScript 5 (ES5) 风格来编写代码也变得更加可行。与此同时,一个新的 ECMAScript 规范也开始启动。**到了这时,大家开始逐渐习惯以对 ECMAScript 规范的版本支持程度来形容各种 JavaScript 实现**。在正式被指名为 ECMAScript 第 6 版 (ES6) 之前,这个新的标准原本被称为 ES.Harmony(和谐)。2015 年,负责制定 ECMAScript 规范草案的委员会 TC39 决定将定义新标准的制度改为一年一次,这意味着每个新特性一旦被批准就可以添加,而不像以往一样,规范只有在整个草案完成,所有特性都没问题后才能被定稿。因此,ECMAScript 第 6 版在六月份公布之前,又被重命名为了 ECMAScript 2015(ES2015) 目前,仍然有很多新的 JavaScript 特性或语法正在提议中,包括[decorators(装饰者)](https://github.com/wycats/javascript-decorators),[async-await(async-await 异步编程模型)](https://github.com/lukehoban/ecmascript-asyncawait)和[static class properties(静态类属性)](https://github.com/jeffmo/es-class-properties)。它们通常被称为 ES7,ES2016 或者 ES.Next 的特性,不过实际上它们只能被称作提案或者说可能性,毕竟 ES2016 的规范还没有完成,有可能全部都会引入,也有可能一个都没有。TC39 把一个提案分为 4 个阶段,你可以在[Babel 的官网](https://babeljs.io/docs/usage/experimental/)上查看各个提案目前都在哪个阶段了。 ## 如何使用这一大堆术语 所以,我们该如何使用这一大堆术语呢?下面的列表或许能帮助到你: ECMAScript:一个由 ECMA International 进行标准化,TC39 委员会进行监督的语言。通常用于指代标准本身。 JavaScript:ECMAScript 标准的各种实现的最常用称呼。这个术语并不局限于某个特定版本的 ECMAScript 规范,并且可能被用于任何不同程度的任意版本的 ECMAScript 的实现。 * ECMAScript 5 (ES5):ECMAScript 的第五版修订,于 2009 年完成标准化。这个规范在所有现代浏览器中都相当完全的实现了。 * ECMAScript 6 (ES6) / ECMAScript 2015 (ES2015):ECMAScript 的第六版修订,于 2015 年完成标准化。这个标准被部分实现于大部分现代浏览器。可以查阅[这张兼容性表](http://kangax.github.io/compat-table/es6/)来查看不同浏览器和工具的实现情况。 * ECMAScript 2016:预计的第七版 ECMAScript 修订,计划于明年夏季发布。这份规范具体将包含哪些特性还没有最终确定 * ECMAScript Proposals:被考虑加入未来版本 ECMAScript 标准的特性与语法提案,他们需要经历五个阶段:Strawman(稻草人),Proposal(提议),Draft(草案),Candidate(候选)以及 Finished (完成)。 在这整个 Blog 中,我将把目前的 ECMAScript 版本称作 ES6(因为这是大部分开发者最习以为常的),把明年的规范称作 ES2016(因为,与 ES6/ES2015 不同,这个名字将在整个标准化过程中沿用)并且将那些还没有成为 ECMAScript 定稿或草案的未来语言概念称为 ECMAScript 提案或者 JavaScript 提案。我将尽我所能在任何可能引起困惑的场合沿用这篇文章。 ## JavaScript的版本 1997年7月,ECMAScript 1.0发布。 1998年6月,ECMAScript 2.0版发布。 1999年12月,ECMAScript 3.0版发布,成为JavaScript的通行标准,得到了广泛支持。 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。 2009年12月,ECMAScript 5.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开发的主流标准,并在此后五年中一直保持这个位置。 2011年6月,ECMAscript 5.1版发布,并且成为ISO国际标准(ISO/IEC 16262:2011)。到了2012年底,所有主要浏览器都支持ECMAScript 5.1版的全部功能。 2013年3月,ECMAScript 6草案冻结,不再添加新功能。新的功能设想将被放到ECMAScript 7。 2013年12月,ECMAScript 6草案发布。然后是12个月的讨论期,听取各方反馈。 2015年6月,ECMAScript 6正式发布,并且更名为“ECMAScript 2015”。这是因为TC39委员会计划,以后每年发布一个ECMAScirpt的版本,下一个版本在2016年发布,称为“ECMAScript 2016”。 > 除了ECMAScript的版本,很长一段时间中,Netscape公司(以及继承它的Mozilla基金会)在内部依然使用自己的版本号。 这导致了 JavaScript 有自己不同于 ECMAScript 的版本号。 1996年3月,Navigator 2.0 内置了 JavaScript 1.0。 JavaScript 1.1 版对应 ECMAScript 1.0,但是直到 JavaScript 1.4 版才完全兼容 ECMAScript 1.0。 JavaScript 1.5 版完全兼容 ECMAScript 3.0。 **目前的 JavaScript 1.8 版完全兼容 ECMAScript 5 。** ## ECMAScript发生了什么变化? 编程语言 JavaScript 是 ECMAScript 的实现和扩展,由 ECMA(一个类似W3C的标准组织)参与进行标准化。ECMAScript定义了: [语言语法](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar) – 语法解析规则、关键字、语句、声明、运算符等。 类型 – 布尔型、数字、字符串、对象等。 原型和继承 内建对象和函数的[标准库](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects) – JSON、Math、数组方法、对象自省方法等。 ECMAScript 标准不定义 HTML 或 CSS 的相关功能,也不定义类似 DOM(文档对象模型)的 [Web API](https://developer.mozilla.org/en-US/docs/Web/API) ,这些都在独立的标准中进行定义。 ECMAScript 涵盖了各种环境中 JS 的使用场景,无论是浏览器环境还是类似 [node.js](http://nodejs.org/) 的非浏览器环境。 ## 新标准 上周,ECMAScript 语言规范第6版最终草案提请 Ecma 大会审查,这意味着什么呢? 这意味着在今年夏天,我们将迎来最新的 JavaScript 核心语言标准。 这无疑是一则重磅新闻。早在 2009 年,上一版 ES5 刚刚发布,自那时起,ES 标准委员会一直在紧锣密鼓地筹备新的JS语言标准—— ES6。 ES6 是一次重大的版本升级,与此同时,由于 ES6 秉承着最大化兼容已有代码的设计理念,你过去编写的JS代码将继续正常运行。事实上,许多浏览器已经支持部分 ES6 特性,并将继续努力实现其余特性。这意味着,在一些已经实现部分特性的浏览器中,你的 JS 代码已经可以正常运行。如果到目前为止你尚未遇到任何兼容性问题,那么你很有可能将不会遇到这些问题,浏览器正飞速实现各种新特性。 ## 版本号6 **ECMAScript标准的历史版本分别是1、2、3、5。** 那么为什么没有第4版?其实,在过去确实曾计划发布提出巨量新特性的第4版,但最终却因想法太过激进而惨遭废除(这一版标准中曾经有一个极其复杂的支持泛型和类型推断的内建静态类型系统)。 ES4 饱受争议,当标准委员会最终停止开发 ES4 时,其成员同意发布一个相对谦和的 ES5 版本,随后继续制定一些更具实质性的新特性。这一明确的协商协议最终命名为“Harmony”,因此,ES5 规范中包含这样两句话: >ECMAScript 是一门充满活力的语言,并在不断进化中。 未来版本的规范中将持续进行重要的技术改进。 这一声明许下了一个未来的承诺。 ## 兑现承诺 **2009年发布的改进版本ES5,引入了Object.create()、Object.defineProperty()、getters和setters、严格模式以及JSON对象。**我已经使用过所有这些新特性,并且我非常喜欢ES5做出的改进。但事实上,这些改进并没有深入影响我编写JS代码的方式,对我来说最大的革新大概就是新的[数组](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)方法:[.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)、[. filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)这些。 但是,ES6并非如此!经过持续几年的磨砺,它已成为JS有史以来最实质的升级,新的语言和库特性就像无主之宝,等待有识之士的发掘。新的语言特性涵盖范围甚广,小到受欢迎的语法糖,例如箭头函数(arrow functions)和简单的字符串插值(string interpolation),大到烧脑的新概念,例如代理(proxies)和生成器(generators)。 ES6将彻底改变你编写JS代码的方式! # 附录: 1. ECMAScript:一个由 ECMA International 进行标准化,TC39 委员会进行监督的语言。通常用于指代标准本身。 2. JavaScript:ECMAScript 标准的各种实现的最常用称呼。这个术语并不局限于某个特定版本的 ECMAScript 规范,并且可能被用于任何不同程度的任意版本的 ECMAScript 的实现。 3. ECMAScript 5 (ES5):ECMAScript 的第五版修订,于 2009 年完成标准化。这个规范在所有现代浏览器中都相当完全的实现了。 4. [ECMAScript 6 (ES6) / ECMAScript 2015 (ES2015)](http://www.ecma-international.org/ecma-262/6.0/index.html):ECMAScript 的第六版修订,于 2015 年完成标准化。这个标准被部分实现于大部分现代浏览器。可以查阅这张[兼容性表](https://kangax.github.io/compat-table/es6/)来查看不同浏览器和工具的实现情况。 5. ECMAScript 2016:预计的第七版 ECMAScript 修订,计划于明年夏季发布。这份规范具体将包含哪些特性还没有最终确定 6. ECMAScript Proposals:被考虑加入未来版本 ECMAScript 标准的特性与语法提案,他们需要经历五个阶段:Strawman(稻草人),Proposal(提议),Draft(草案),Candidate(候选)以及 Finished (完成)。 ## 一些资源 * [TC39 的Github 仓库](https://github.com/tc39/ecma262)上可以看到所有目前公开的提案 * 如果你还不熟悉 ES6,Babel 有一个很不错的[特性概览](https://babeljs.io/docs/learn-es2015/) * 如果你希望深入 ES6,这里有两本很不错的书: Axel Rauschmayer 的[Exploring ES6](http://exploringjs.com/)和 Nicholas Zakas 的[Understanding ECMAScript 6](https://leanpub.com/understandinges6)。 * [Axel 的博客2ality](http://www.2ality.com/)也是很不错的 ES6 资源