近年来,JavaScript 的发展可谓风起云涌。每年都有新的 ECMAScript 规范发布,这使得 JavaScript 的版本管理、各个版本的功能支持以及如何编写面向未来的代码变得容易混淆。
为了更好地理解这看似持续不断的更新浪潮背后的原因,让我们简要回顾一下 JavaScript 及其版本的历史,并了解标准化过程为何如此重要。
关键要点
JavaScript 版本管理的早期历史
JavaScript 的原型于 1995 年 5 月由 Brendan Eich 在短短十天内编写完成。他最初被招募来为 Netscape Navigator 实现 Scheme 运行时,但管理团队推动使用一种 C 风格的语言来补充当时新发布的 Java。
JavaScript 于 1995 年 12 月在 Netscape Navigator 版本 2 中首次亮相。次年,微软对 JavaScript 进行了逆向工程,创建了自己的版本,称为 JScript。JScript 与 Internet Explorer 浏览器版本 3 一起发布,几乎与 JavaScript 完全相同——甚至包括所有相同的错误和怪癖——但它确实有一些额外的 Internet Explorer 独有特性。
ECMAScript 的诞生
确保 JScript(以及任何其他变体)与 JavaScript 保持兼容的必要性促使 Netscape 和 Sun Microsystems 对该语言进行标准化。他们在欧洲计算机制造商协会(ECMA)的帮助下完成了这项工作,ECMA 将负责托管该标准。标准化后的语言被称为 ECMAScript,以避免侵犯 Sun 的 Java 商标——此举造成了相当多的混淆。最终,ECMAScript 用于指代规范,而 JavaScript(现在仍然如此)用于指代语言本身。
负责 JavaScript 版本管理和维护 ECMAScript 的工作组被称为技术委员会 39,或 TC39。它由来自 Apple、Google、Microsoft 和 Mozilla 等所有主要浏览器厂商的代表组成,以及其他对 Web 发展感兴趣的公司受邀的专家和代表。他们定期举行会议,以决定该语言的发展方向。
当 JavaScript 于 1997 年由 TC39 标准化时,该规范被称为 ECMAScript 版本 1。最初,ECMAScript 的后续版本每年发布一次,但由于缺乏共识以及 ECMAScript 4 周围难以管理的大型功能集,最终变得零星。因此,该版本被终止并缩小到 3.1,但并未以该名称最终确定,而是最终演变为 ECMAScript 5。它于 2009 年 12 月发布,距 ECMAScript 3 发布 10 年后,并引入了 JSON 序列化 API、Function.prototype.bind 和严格模式等功能。两年后,发布了一个维护版本来澄清最新迭代 5.1 中的一些歧义。
ECMAScript 2015 和年度发布的复兴
随着 TC39 解决因 ECMAScript 4 导致的分歧,Brendan Eich 强调需要更短期、更小规模的发布。这些新的规范中的第一个是 ES2015(最初命名为 ECMAScript 6 或 ES6)。这个版本是一个庞大但必要的基石,为未来的年度 JavaScript 版本管理提供了支持。它包含许多当今许多开发人员都非常喜欢的特性,例如:
ES2015 是第一个遵循 TC39 过程 的版本,这是一个基于提案的模型,用于讨论和采纳语言特性。
TC39 过程
在提案被接受到即将发布的 ECMAScript 版本之前,它必须经过五个阶段。
这是一个方便的步骤,允许向规范提交想法。任何人都可以提出特性建议——即注册为贡献者的 TC39 成员和非成员。
提案正式化的第一个阶段。必须:
必须选择一位 负责人 来采纳和推进该提案。此人必须是 TC39 成员。
这是该特性可能包含在 ECMAScript 未来版本中的里程碑。在此,使用规范描述的正式语言详细说明提案的语法和语义。此时应该提供实验性实现。
在此,提案的大部分内容和支持技术已经开发完成,但需要来自用户和实现者(例如浏览器厂商)的进一步反馈。一旦获得并采取行动,概要和规范细节将由指定的审阅者和指定的编辑最终确定和签字。由于此阶段需要符合的实现,因此此后只接受关键更改。
该提案已被接受,可以添加到 ECMAScript 中。因此,它固有地:
上述代码库的贡献文档进一步详细说明了使用 GitHub 问题和拉取请求来管理对语言的添加。
展望未来
在完成 ES2015 和建立 TC39 的 JavaScript 版本管理和更新过程之后,后续版本每年六月发布,提案的包含时间限制为一年。在撰写本文时,已经有三个新的规范。
也称为 ES7,这是 ECMAScript 的第一个较小、增量版本。除了错误修复之外,它只添加了两个特性。
此实例方法简化了在数组中搜索值的操作:
<code class="language-javascript">// ES2016 之前: const hasBob = names.indexOf('bob') > -1; // ES2016: const hasBob = names.includes('bob');</code>
在 ES2016 之前,可以使用 Math.pow(base, exponent) 执行幂运算。此版本引入了一个运算符(**),它具有自己的优先级:
<code class="language-javascript">// ES2016 之前 Math.pow(5, 3); // => 125 // ES2016 5 ** 3; // => 125</code>
ES2017(又名 ES8)是一个稍大的版本,包含一些有用的方法和语法结构。
Promise 已将我们从回调地狱中解救出来,但它们的 API 仍然表现出冗长。异步函数使用与同步代码非常相似的语法对它们进行了抽象:
<code class="language-javascript">// Promise const getProfile = name => { return fetch(`https://some-api/people/${name}`) .then(res => res.json()) .then(({ profile }) => profile); // 从解析的对象中解构 `profile` }; // async/await const getProfile = async name => { const res = await fetch(`https://some-api/people/${name}`); const { profile } = await res.json(); return profile; };</code>
String.prototype.padStart(length, padder) 和 padEnd(length, padder) 将分别在字符串的开头和结尾重复添加 padder(这是可选的,默认为空格),直到达到 length 个字符:
<code class="language-javascript">'foo'.padStart(6); // => ' foo'; 'foo'.padEnd(6); // => 'foo '; 'foo'.padStart(10, 'bar'); // => 'barbarbfoo'; 'foo'.padEnd(10, 'bar'); // => 'foobarbarb';</code>
其他特性包括尾随逗号、共享内存和原子操作以及静态对象方法(Object.entries()、Object.values() 和 Object.getOwnPropertyDescriptors())。
在撰写本文时,这个最新版本引入了一小部分强大的新增功能。
虽然 Promise.all() 允许您等待多个 Promise 的解析,但在某些情况下,您可能需要顺序迭代异步检索的值。现在可以与 Promise 数组一起等待异步迭代器:
<code class="language-javascript">// ES2016 之前: const hasBob = names.indexOf('bob') > -1; // ES2016: const hasBob = names.includes('bob');</code>
表面上看,由于 Babel 等编译器的可用性,这两个语法改进在 JavaScript 开发人员中已经很流行。对象展开和剩余属性类似于数组展开和剩余属性,并允许浅复制和对象属性的分组解构:
<code class="language-javascript">// ES2016 之前 Math.pow(5, 3); // => 125 // ES2016 5 ** 3; // => 125</code>
其他已接受的提案包括 Promise.prototype.finally(),以及对正则表达式和模板字面量的增强。
结语
JavaScript 在很短的时间内得到了极大的发展。虽然这归功于 ECMAScript 标准和 TC39 的出色工作,但由于之前 JavaScript 版本管理和开发缺乏稳定性和凝聚力,这最初是一段艰辛的旅程。
由于提案过程相对成熟,该语言只能以务实和可控的方式改进。对于 Web 开发人员来说,这是一个伟大的时代!
关于 JavaScript 版本管理的常见问题解答:ES6 和 ES2015
ES6 和 ES2015 本质上是相同的。ES6 是由 ECMA 国际标准化的 ECMAScript 编程语言的第六版。ES2015 只是 ES6 的新名称,反映了它发布的年份。重命名是为了反映发布年份并摆脱版本号,这可能会造成混淆。
将 ES6 重命名为 ES2015 是为了反映其发布年份并摆脱版本号。此举是为了避免混淆,并表明 JavaScript 是一种不断更新和改进的动态语言。新的命名约定也有助于表明语言更新和改进的规律性。
ES6/ES2015 为 JavaScript 引入了许多新特性,包括用于变量声明的 let
和 const
、用于更短函数语法的箭头函数、用于字符串插值的模板字面量、用于面向对象编程的类、用于异步编程的 Promise 以及用于代码组织的模块等等。
ES6/ES2015 通过多种方式改进 JavaScript 编码。它引入了使该语言更强大且更易于使用的新语法和特性。例如,箭头函数提供了更简洁的函数编写语法,而 Promise 使处理异步操作更容易。模块的引入也有助于更好地组织代码,使其更易于管理和维护。
要在 JavaScript 代码中开始使用 ES6/ES2015 特性,您可以使用像 Babel 这样的转译器,它将 ES6 代码转换为可在当前浏览器中运行的 ES5 代码。您还可以使用像 Webpack 这样的模块打包器来管理和捆绑您的 JavaScript 模块。
虽然大多数现代浏览器都支持 ES6/ES2015 的大部分特性,但与旧版浏览器可能存在一些兼容性问题。为了确保兼容性,您可以使用 polyfill,它提供了您期望浏览器原生支持的功能。
JavaScript 是一种最初由 Netscape 开发的编程语言。ECMAScript 是由 ECMA 国际标准化的 JavaScript 标准版本。JavaScript 实现 ECMAScript,这意味着它遵循 ECMAScript 标准中定义的规则和结构。
ES6/ES2015 之后,JavaScript 将继续发展,每年都会发布新版本,每个版本都会引入新的特性和改进。JavaScript 的未来可能会看到更强大的特性、更好的性能以及跨不同平台和设备的更高兼容性。
TypeScript 是 JavaScript 的超集,它为该语言添加了静态类型。它支持 ES6/ES2015 的所有特性,甚至包括 JavaScript 中找不到的一些附加特性。TypeScript 代码被转译为 JavaScript,因此它可以在任何 JavaScript 环境中运行。
与早期版本的 JavaScript 相比,使用 ES6/ES2015 提供了许多好处。它引入了使该语言更强大且更易于使用的新语法和特性。它还改进了代码组织和可维护性,并为复杂的应用程序和大型代码库提供了更好的支持。
以上是ES6(ES2015)及以后:了解JavaScript版本的详细内容。更多信息请关注PHP中文网其他相关文章!