Skip to content

ECMAScript 2018

ECMAScript 2018(ES9)于 2018 年 6 月发布。

核心特性

1. 异步迭代器(Asynchronous Iteration)

引入了 异步迭代器(Async Iterators) 和 for-await-of 循环,支持异步数据源的迭代。通过 for-await-of 循环,开发者可以按异步顺序迭代生成器或异步可迭代对象(如异步获取的数据)。

javascript
async function* asyncGenerator() {
  yield 1;
  yield 2;
  yield 3;
}

(async () => {
  for await (const num of asyncGenerator()) {
    console.log(num); // 1, 2, 3
  }
})();

影响

  • 简化异步流控制:使得在处理异步流(如文件读取、网络请求等)时,代码更简洁,类似于同步迭代的结构。
  • 提升代码可读性:使用 for-await-of 循环可以使异步迭代更具可读性和简洁性。

2. 正则表达式增强(Regular Expressions)

增加了几个正则表达式的新特性,增强了正则表达式的功能和表达能力:

  • 命名捕获组(Named Capture Groups):通过为捕获的组命名,可以更轻松地访问正则表达式中的子匹配结果。
  • 正则表达式修饰符 s(dotAll):s 修饰符使得 . 匹配所有字符,包括换行符。
  • Unicode 属性匹配(Unicode Property Escapes):可以根据 Unicode 属性来匹配字符(如匹配所有字母字符、标点符号等)。

命名捕获组:

javascript
const regex = /(?<first>\w+) (?<last>\w+)/;
const result = regex.exec("John Doe");
console.log(result.groups.first); // 'John'
console.log(result.groups.last); // 'Doe'

s 修饰符:

javascript
const regex = /foo.bar/s;
console.log(regex.test("foo\nbar")); // true

Unicode 属性匹配:

javascript
const regex = /\p{Letter}/u;
console.log(regex.test("a")); // true
console.log(regex.test("1")); // false

影响

  • 增强正则表达式的可读性和功能:命名捕获组使得正则表达式的匹配结果更加易于理解,Unicode 属性匹配提供了更强的字符匹配能力。
  • 支持跨行匹配:dotAll 模式使得 . 可以匹配换行符,简化跨行文本的正则处理。

3. Object.prototype.values() 和 Object.prototype.entries() 改进

Object.values()Object.entries() 的行为得到了进一步规范和增强,确保它们能返回对象的自身属性值和键值对,排除继承属性。

javascript
const obj = { a: 1, b: 2, c: 3 };
console.log(Object.values(obj)); // [1, 2, 3]
console.log(Object.entries(obj)); // [['a', 1], ['b', 2], ['c', 3]]

影响

  • 简化对象操作:通过 Object.values() 和 Object.entries(),可以更容易地获取对象的值和键值对,简化了遍历和处理对象的代码。
  • 提高一致性:这些方法现在在各个 JavaScript 引擎中表现一致。

4. 变量声明(let 和 const)的作用域改进

在 ES2018 中,对 letconst 的作用域处理进行了进一步的规范化,特别是对于在循环和块级作用域中的使用。

javascript
for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1000);
}
// 输出 0, 1, 2

影响

  • 块级作用域增强:let 和 const 的作用域更为清晰,解决了 var 在循环中存在的闭包问题。

5. Promise.prototype.finally() 方法

finally() 方法为 Promise 增加了一个新的链式回调,允许开发者在 Promise 执行完毕后,无论是成功还是失败,都执行一些清理工作(如关闭资源、清理状态等)。

javascript
fetch("https://example.com")
  .then((response) => response.json())
  .catch((error) => console.error("Error:", error))
  .finally(() => {
    console.log("Cleanup or final task");
  });

影响

  • 简化最终操作的处理:开发者可以在 Promise 执行完成后,执行一些清理操作或最终任务,而无需再次处理 .then() 或 .catch()。

兼容性

Chrome 63+
Firefox 63+
Safari 11+
Edge 63+
IE 不支持
Node 10+

注:兼容性数据可能随着版本的更新而有所调整,建议开发者根据项目的具体需求参考最新的浏览器版本和 Polyfill 支持情况。

总结

ECMAScript 2018(ES9)带来了多个重要的增强特性,尤其是在数组处理、对象转换、字符串操作和符号描述等方面。通过这些新特性,JavaScript 更加高效、简洁,尤其是在处理数据和优化代码结构时,开发者将能够享受到更现代化的编程体验。

参考文献

ECMA-262 2018 规范 👉

Released under the MIT License.