JavaScript 的标准化
故事时间到了!1995 年, Netscape 的Brendan Eich开发了一种名为 JavaScript 的新语言。这是一种脚本语言,旨在使网页更具交互性和动态性,因为它可以直接在浏览器中运行。
微软大约在同一时间意识到他们需要一种类似的脚本语言用于 Internet Explorer,因此他们想出了Jscript,这是微软自己对 JavaScript 的实现,并以此命名以避免商标问题。
那么这是否意味着 JavaScript 是由私人组织维护和实施的?幸运的是,不是的。
1996 年,Netscape 与ECMA接洽,希望对 JavaScript 语言进行标准化。其目标是确保所有浏览器都实现该语言的相同核心功能,这样开发人员就不必费心编写在不同平台上一致运行的代码。
ECMA 国际的作用
ECMA 国际是一个非营利性标准组织,负责监督多项技术的开发和标准化。该组织成立于 1961 年,当时的名称为欧洲计算机制造商协会(ECMA)。
1996 年, ECMAScript诞生,它是 JavaScript、Jscript 和许多其他 JavaScript 子语言的标准基础。ECMAScript 这个名字基本上是参与标准化该语言的组织(尤其是 Netscape 和 Microsoft)之间的妥协。
ECMAScript 的第一版于 1997 年 6 月由 ECMA 大会通过。此后,该语言标准已发布了多个版本。2016 年之后,JavaScript(ECMAScript)的新特性每年都会推出。
但是谁来提出、确定并且最重要的是实施这些变化呢?
TC39
技术委员会39 (TC39) 介入了这一工作。它是 ECMA 的一个小组,负责发展 ECMAScript。语言专家、独立开发者以及 Google、Microsoft、Mozilla、Apple 等主要科技公司的代表是 TC39 的部分成员。每家公司的参与都确保 JavaScript 在各种平台上保持稳健、多功能和面向未来。
TC39 的优势在于其开放性。所有提案和会议记录均公开,社区反馈对变更起着重要作用。来自世界各地的开发人员都可以在 GitHub 上提供提案、反馈或以观察员身份参加会议。
在 TC29 中,遵循一系列长期而谨慎的步骤来规划和实施 JavaScript 的新变化。
第 0 阶段:Strawman稻草人
第一阶段,提案以粗略想法的形式提出。此时,提案尚无正式价值,仅仅是社区讨论的焦点。
示例:开发人员可能会提出一种用于解构对象的新语法,但不提供详细规范。
第二阶段:草案
现在该提案已得到进一步发展,正式规范开始成形。关于提议功能的语法、语义和行为的细节已得到完善和记录。
结果:该草案可能会由 TC39 审查,并寻求反馈以解决任何问题。
第三阶段:候选阶段
这是一个关键阶段,提案在此阶段被视为稳定并准备实施。规范已成熟,预计该功能将按预期运行。
在此阶段,JavaScript 引擎(如 Chrome 的 V8、Firefox 的 SpiderMonkey 或 Safari 的 JavaScriptCore)中必须至少有一个完整的实现,以证明该功能可以有效实现。
一旦在此阶段获得批准,该提案就可以纳入下一版本的 ECMAScript 标准中。
第四阶段:完成
在最后阶段,该提案已经过彻底审查、实施并被纳入 ECMAScript 规范。
该功能将成为 ECMAScript 官方标准的一部分,并包含在下一个年度版本中。
ES2024 中的变化
以下是 ECMAScript 2024 带来的一些变化:
1. 时间 API
更新后的 Temporal API 解决了现有 Date 对象的限制,提供了处理日期和时间的现代方法。
这是来自时间 API 提案的一个块:
上述一些问题在 date 的当前实现中是可以修复的。可以通过向 date 添加新的工厂函数来缓解时区支持的不足 — 比如:
var zonedDate = Date.inZone(zoneIdentifier, dateString);
这种技术可能也可以用来支持非公历:
var calendarDate = Date.withCalendar('Hijri', dateString);
同样,我们可以向 Date 添加 API,使计算更加容易。例如,现在无法添加或减去时间,而是必须执行获取/设置行为。向日期添加一周的操作如下:
var myDate = new Date(); |
addDays()不过,指定一种方法来让事情变得更好一点,这并不是什么大问题:
var myDate = new Date(); |
应用程序: Temporal 增强了日期时间操作,提供了创建、比较和格式化日期和时间的方法,这对于处理时间敏感数据的应用程序至关重要。
2. 格式正确的 Unicode 字符串
此功能旨在增强 Unicode 字符串的处理能力,确保它们在不同环境中格式正确且一致。这对于国际化和正确表示不同的字符集至关重要。
该toWellFormed()方法将具有无效序列(单独代理)的字符串转换为有效的 Unicode 字符串,并用 Unicode 替换字符替换它们。
3. 顶层 Await
概述:顶层 await 功能允许await在模块顶层使用关键字,从而可以更直接地编写异步代码,而无需将其包装在异步函数中。
const obj = await getJson ( ); |
4. 管道Pipeline Operator
概述:管道运算符 ( |>) 允许使用函数式编程风格,将一个函数的结果作为下一个函数的输入。这在链接多个函数调用时提高了代码的可读性。
const val = - 10 |
应用:该运算符简化了复杂的数据转换和操作,使代码更易于理解并减少嵌套。