Skip to content

ECMAScript 2017

ECMAScript 2017(ES8)于 2017 年 6 月发布。

核心特性

1. async / await

引入了 asyncawait 关键字,这两个关键字极大简化了异步代码的书写。async 用于定义异步函数,await 用于等待 Promise 对象的解析,避免了回调函数和链式 .then() 的层层嵌套。

javascript
function fetchData() {
  return new Promise((resolve) => {
    setTimeout(() => resolve("Data fetched"), 2000);
  });
}

async function getData() {
  const data = await fetchData();
  console.log(data); // 'Data fetched'
}

getData();

影响

  • 更简洁的异步代码:async/await 使得处理异步逻辑时不再需要使用复杂的回调或者 .then() 链式调用,代码结构更为清晰。
  • 增强可读性:代码看起来更像同步代码,开发者可以更容易地理解异步操作的流程。

2. Object.entries() 和 Object.values()

引入了 Object.entries()Object.values() 方法,分别用于获取对象的键值对数组和对象的值数组。这两个方法极大简化了处理对象时的迭代操作。

  • Object.entries():返回一个数组,其中包含对象所有自身属性的键值对(以数组形式)。
  • Object.values():返回一个包含对象所有自身属性值的数组。
javascript
const obj = { a: 1, b: 2, c: 3 };

console.log(Object.entries(obj)); // [['a', 1], ['b', 2], ['c', 3]]
console.log(Object.values(obj)); // [1, 2, 3]

影响

  • 简化对象操作:这两个方法使得操作对象变得更加简单,尤其是在需要迭代对象属性时,代码更简洁、易读。
  • 更方便的数据处理:当需要将对象转换为数组格式进行操作时,Object.entries()Object.values() 提供了直接的方式。

3. String padding (padStart() 和 padEnd())

引入了 String.prototype.padStart()String.prototype.padEnd() 方法,用于在字符串的开始或结束填充指定的字符,直到字符串达到指定的长度。这对于格式化字符串(例如,数字填充零)非常有用。

  • padStart(targetLength, padString):在字符串的开头填充指定的字符,直到字符串的总长度达到目标长度。
  • padEnd(targetLength, padString):在字符串的结尾填充指定的字符,直到字符串的总长度达到目标长度。
javascript
let str = "5";

console.log(str.padStart(3, "0")); // '005'
console.log(str.padEnd(3, "0")); // '500'

影响

  • 简化字符串格式化:开发者可以更容易地进行字符串格式化操作,例如填充日期、时间或数字,避免手动编写繁琐的字符串处理代码。
  • 提升代码可读性:减少了对传统 if 语句或其他字符串操作方法的依赖,使得代码更加简洁。

4. Shared Memory 和 Atomics

引入了 SharedArrayBufferAtomics,这两个特性为多线程编程提供了支持,使得 JavaScript 可以进行共享内存操作。这对于 Web Workers 或者多线程环境中的数据同步并发控制非常重要。

  • SharedArrayBuffer:提供一种在多个线程间共享内存的方式。
  • Atomics:提供原子操作,用于安全地访问共享内存中的数据。
javascript
// 使用 SharedArrayBuffer 创建共享内存
const buffer = new SharedArrayBuffer(1024); // 创建一个 1024 字节的共享内存缓冲区
const view = new Int32Array(buffer);

// 使用 Atomics 进行原子操作
Atomics.store(view, 0, 123);
console.log(Atomics.load(view, 0)); // 输出 123

影响

  • 增强并发处理能力:SharedArrayBufferAtomics 为 JavaScript 提供了对共享内存线程同步的支持,这对于 Web WorkersWebAssembly并行计算非常重要。
  • 多线程编程:使得 JavaScript 在需要多线程支持的场景中能够更高效地运行,解决了单线程模型下的性能瓶颈。

兼容性

Chrome 58+
Firefox 55+
Safari 10+
Edge 15+
IE 不支持
Node 7.6+

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

总结

ECMAScript 2017(ES8)带来了几个非常重要的特性,尤其是 async / await,使得异步编程变得更加直观和简洁;Object.entries() 和 Object.values() 方法简化了对对象的操作;而 共享内存和原子操作 为多线程编程提供了强有力的支持。

参考文献

ECMA-262 2017 规范 👉

Released under the MIT License.