[译] JavaScript 简史

1,778 阅读5分钟

JavaScript 简史

JavaScript 的起源以及这些年的发展情况

大约十年前[1],Jeff Atwood(Stackoverflow 创始人)断言 JavaScript 将会是未来的方向,并创造了 “Atwood 定律”:任何可以使用 Javascript 编写的程序,最终都会由 Javascript 编写。十年后的今天,这个断言相比之前更加可信了。JavaScript 的应用范围不断扩大。

JavaScript 发布

JavaScript 最初由 NetScape 的 Brendan Eich 创造,并在 1995 年 Netscape 的闻稿中首次发布。它有着非同寻常的命名历史:首先由创造者命名为 Mocha,接着被重命名为 LiveScript。1996 年,在发布大约一年之后,NetScape 希望能够蹭蹭 Java 社区的热度(虽然 JavaScript 与 Java 毫无关系),因此决定再将其重命名为 JavaScript,并发布了支持 JavaScript 的 Netscape 2.0 浏览器。

ES1、ES2 和 ES3

1996 年,Netscape 决定将 JavaScript 提交到 ECMA 国际,期望将其标准化。第 1 版标准规范在 1997 年发布,同时该语言也被标准化了。在首次发布之后,ECMAScript 的标准化工作持续进行,不久之后,发布了两个新的版本:1998 年的 ECMAScript 2 和 1999 年的 ECMAScript 3。

十年沉寂和 ES4

1999 年发布 ES3 之后,官方标准出现了十年的沉寂,这期间没有任何变化。第 4 版标准起初有一些进展,部分被讨论的特性有类、模块、静态类型、解构等等。它本来定在 2008 年发布,但是由于关于语言复杂度的不同政治意见[2]而被废弃。但是,浏览器厂商不停引入语言的扩展,这让开发者大伤脑筋 —— 他们只能添加 polyfill[3] 来解决不同浏览器之间的兼容性问题。

从沉寂到 ES5

Google、Microsoft、Yahoo 和其余 ES4 的争论者最终走到了一起,决定在 ES3 之上创造一个小范围的更新,并暂时命名为 ES3.1。但是整个团队仍旧关于 ES4 该包含什么内容而争论不休。终于,在 2009 年,ES5 发布了,主要修复了兼容性和安全问题等。但是它并没有翻起多大浪花 —— 经过了数年时间后浏览器厂商才完全遵循了相关标准,许多开发者在不知道 “现代” 标准的情况下依旧使用 ES3。

ES6 —— ECMASript 2015 发布

在 ES5 发布数年之后,事情开始有了转机。TC39(ECMA 国际之下负责 ECMAScript 标准化的委员会)持续进行下一版本的标准化的工作,该版本的 ECMAScript(ES6)起初命名为 ES Harmony[4],在最终发布时被命名为 ES2015。ES2015 添加了许多重要的特性和语法糖以便于编写复杂的程序。部分 ES6 提供的特性包括了类、模块、箭头函数、加强的对象字面量、模板字符串、解构、默认参数 + Rest 参数 + Spread 操作符、Let 和 Const 语法、异步迭代器 + for..of、生成器、集合 + 映射、Proxy、Symbol、Promise、math + number + string + array + object 的 API 等等[5]

浏览器对 ES6 的支持依旧十分有限,但是开发者只需要编写 ES6 代码并将其转译至 ES5,就可以使用 ES6 的所有特性。随着第 6 版 ECMAScript 的发布,TC39 决定以每年更新的模式来发布 ECMAScript 的更新,这样新特性就可以在通过时尽快地加入标准,不需要等待完整的规范起草和通过 —— 因此第 6 版 ECMAScript 在 2015 年 6 月发布前,被命名为 ECMAScript 2015 或 ES2015。并且之后的 ECMAScript 版本发布定于每年 6 月。

ES7 —— ECMASript 2016 发布

在 2016 年 6 月,第 7 版 ECMAScript 发布了。由于 ECMAScript 变成了年更模式,ECMAScript 2016(ES2016)相对来说没有太多新内容。ES2016 只包含了两个新特性:

  • 指数运算符 **
  • Array.prototype.includes

ES8 —— ECMAScript 2017 发布

第 8 版 ECMAScript 在 2017 年 6 月发布。ES8 主要的亮点在于增加了异步函数,以下是 ES8 新特性的列表:

  • Object.values()Object.entries()
  • 字符串填充 比如 String.prototype.padEnd()String.prototype.padStart()
  • Object.getOwnPropertyDescriptors
  • 在函数参数定义和函数调用中使用尾后逗号
  • 异步函数

什么是 ESNext

ESNext 是一个动态的名字,指当前的 ECMAScript 版本。例如,在本文编写的时候,ES2017ES8ESNext

未来会发生什么

自从 ES6 发布后,TC39 极大提高了他们的效率。 现在 TC39 以 Github 组织的形式运行,在上面有许多关于下一版的 ECMAScript 新特性和语法的提议。任何人都可以发起提议,因此开发者社区可以更多地参与进来。在正式形成规范前,每个提议都会经过四个发展阶段

这差不多就是全部内容了,欢迎在评论区留下你的反馈。以下是原始语言规范的链接:ES6ES7ES8

  1. 译者注:本文写于 2017 年,所以十年前是 2007 年。↩︎
  2. 译者注:技术层面的分歧以及商业政治都是 ES4 失败的原因,知乎上曾经有过相关的讨论↩︎
  3. 译者注:Web 开发中,polyfill 指用于实现浏览器并不支持的原生 API 的代码。↩︎
  4. 译者注:Harmony 有和谐,协调的意思。↩︎
  5. 译者注:如果你感兴趣,可以使用这个中文教程学习这些特性。↩︎

如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏