ECMAScript 是 JavaScript 的标准规范,每年都会发布一次更新版本。2018 年发布的 ECMAScript 2018 中,引入了许多新的特性和扩展,其中包括异步迭代器等。本文将深入探讨 ECMAScript 2018 中的异步迭代器以及其他扩展,并提供示例代码和学习指导意义。
1. 异步迭代器
迭代器是一个对象,它具有一个 next()
方法,每次调用该方法都会返回一个包含 value
和 done
两个属性的对象。value
表示当前迭代到的值,done
表示迭代器是否已经完成。异步迭代器就是对迭代器的一种扩展,它每次从一个异步数据源中获取数据,而不是同步数据源中的数据。
在异步迭代器中,next()
方法返回的是一个 promise 对象,这个 promise 对象解析后可以得到包含 value
和 done
的对象。下面是一个简单的异步迭代器示例:
-- -------------------- ---- ------- ----- ------------- - - ------------------------ - --- - - -- ------ - ----- ------ - -- -- - -- - ----- --- --------------- -- ------------------- ------- ------ - ------ ---- ----- ----- -- - ------ - ----- ---- -- - - - -- ----- - - ----- -- -- - --- ----- ------ - -- -------------- - --------------- - -- ----展开代码
这个示例中,我们定义了一个 asyncIterable
对象,它实现了 Symbol.asyncIterator
方法,该方法返回了一个包含异步 next()
方法的迭代器。在 next()
方法中,我们通过 await
延迟了 1 秒钟,并返回了一个对象,其中 value
包含着当前迭代到的值,done
表示是否迭代完成。在 f()
函数中,我们使用 for await...of
遍历了整个异步迭代器。
2. Promise 的 finally 方法
在 ECMAScript 2018 中,Promise 增加了一个新的成员方法 finally()
,该方法可以在 Promise 被 resolve 或 reject 后,无论结果如何,都会执行一些操作。
下面是一个示例代码:
-- -------------------- ---- ------- ----- -------------- - -- -- - ------ --- ----------------- ------- -- - ------------- -- - ---------------- -- ------ --- -- -------------------------- -- - ------------------ -------------- -- - --------------------- ------------- -- - ------------------ ----------- ---展开代码
在这个示例中,finally()
方法会在 Promise 被 resolve 或 reject 后,都会执行,在这里输出了一个 fetch complete
的信息。
3. Rest/Spread 属性
在 ECMAScript 2018 中,增加了 Rest/Spread 属性的支持,可以让我们更方便地处理对象或数组。
Rest 属性用于将对象或数组的剩余属性组合到一个新的对象或数组中。下面是一个示例:
const person = { name: 'Alice', age: 20, gender: 'female' }; const { age, ...others } = person; console.log(age, others); // 输出:20 { name: 'Alice', gender: 'female' } const arr = [1, 2, 3, 4, 5]; const [first, ...rest] = arr; console.log(first, rest); // 输出:1 [2, 3, 4, 5]
Spread 属性用于将一个对象或数组的所有属性展开到另一个对象或数组中。下面是一个示例:
const person = { name: 'Bob', age: 30 }; const info = { ...person, gender: 'male' }; console.log(info); // 输出:{ name: 'Bob', age: 30, gender: 'male' } const arr1 = [1, 2, 3]; const arr2 = [...arr1, 4, 5]; console.log(arr2); // 输出:[1, 2, 3, 4, 5]
4. 更简单的正则表达式
在 ECMAScript 2018 中,增加了一些正则表达式的特性,使得正则表达式更简单、更方便。
例如,我们可以使用命名捕获组:
const re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; const result = re.exec('2022-08-08'); console.log(result.groups); // 输出:{year: '2022', month: '08', day: '08'}
我们还可以使用 lookbehind 和 negative lookbehind:
const re = /(?<=\d{3})\d{4}/; console.log(re.test('123456')); // 输出:true console.log(re.test('1234')); // 输出:false const re2 = /(?<!\d{3})\d{4}/; console.log(re2.test('123456')); // 输出:false console.log(re2.test('1234')); // 输出:true
5. 结语
本文介绍了 ECMAScript 2018 中的一些新特性和扩展,其中包括异步迭代器、Promise 的 finally 方法、Rest/Spread 属性以及更简单的正则表达式。这些特性或扩展使得 JavaScript 编程语言变得更加强大、更加灵活,但也需要我们认真学习和理解,才能更好地应用它们。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67c04852314edc26846969c5