概述
ECMAScript(以下简称 ES)是 JavaScript 语言的标准规范,自 1997 年起,每年更新一次,其中每个版本都引入了一些新的语言特性。ES2018 是 ES 的最新版本,引入了一些新的语言特性,其中包括迭代器和生成器技术。本文将深入讲解这些技术及其应用。
迭代器
迭代器是 ES 中的一种重要特性,它提供了一种统一的遍历集合类型(如数组和对象)的机制。在 ES2015 中,引入了 for...of 循环语句,它使用迭代器来遍历集合类型,取代了传统的 for 循环。
迭代器的概念
迭代器是一个对象,它具有 next() 方法,可依次访问集合中的每一个元素。next() 方法返回一个包含 done 和 value 两个属性的对象,done 表示是否遍历完成,value 表示当前遍历到的元素。
迭代器的使用
ES 提供了默认的迭代器,对于数组对象,可以使用它的 Symbol.iterator 属性访问。例如:
const arr = ['a', 'b', 'c']; const iterator = arr[Symbol.iterator](); console.log(iterator.next()); // { done: false, value: 'a' } console.log(iterator.next()); // { done: false, value: 'b' } console.log(iterator.next()); // { done: false, value: 'c' } console.log(iterator.next()); // { done: true, value: undefined }
在 for...of 循环中,也是使用迭代器来遍历集合类型。例如:
const arr = ['a', 'b', 'c']; for (const item of arr) { console.log(item); } // a // b // c
迭代器的应用
迭代器是一种非常强大的遍历集合类型的机制,它可以应用于实现一些高级算法和数据结构。例如,二叉树的中序遍历可使用迭代器来实现。另外,当集合对象中的元素需要按照某种规则进行遍历时,也可以使用自定义迭代器来实现。
生成器
生成器是 ES 中的另一个强大特性,它可以用来简化异步编程,构建可暂停和继续执行的函数。
生成器的概念
生成器是一种函数,它可以通过 yield 关键字将函数的执行暂停并返回一个值,而后重新进入函数并从上次暂停的位置继续执行。生成器函数使用 function* 声明,并使用 yield 关键字声明需要暂停的位置。
生成器的使用
以下是一个简单的例子,用于生成自然数序列。
-- -------------------- ---- ------- --------- ---------------- - --- - - -- ----- ------ - ----- ---- - - ----- ------- - ----------------- ---------------------------------- -- - ---------------------------------- -- - ---------------------------------- -- -
在上面的例子中,我们声明了一个生成器函数 naturalNumbers(),它使用 while 循环来生成自然数序列,并使用 yield 关键字在每个自然数处暂停。在调用生成器函数时,会返回一个迭代器对象,通过调用 next() 方法可以获取序列中的下一个元素。
生成器的应用
生成器函数和 await/async 关键字一起使用,可简化异步编程。生成器函数可以包含异步操作,通过 yield 关键字将异步操作暂停,等待异步操作完成后,重新进入函数并从上次暂停的位置继续执行。以下是一个简单的例子,用于获取数据并将结果输出。
-- -------------------- ---- ------- --------- --------- - ----- ---- - ----- -------------------- ------------------ - ----- -------- ------------------- - ----- -------- - ----- ---------------------------------- ----- ---- - ----- ---------------- ------ ----- - ----- --------- - ---------- ----- ------- -------- - ----------------- ----------------- -- ----------------------
在上面的例子中,我们声明了一个生成器函数 getData(),它包含一个异步操作 getDataFromServer(),并使用 yield 关键字在这里暂停。在调用生成器函数时,我们通过调用 next() 方法获取 promise 对象,并使用其 then() 方法获取异步操作的返回值,并通过调用 next() 方法将返回值传入生成器函数中继续执行。
结论
迭代器与生成器技术是 ES2018 中的两个非常强大的特性,它们可以用来简化异步编程和构建高级算法和数据结构。本文对它们的概念、使用方法和应用进行了详细讲解,并提供了相应的示例代码,希望可以提供一定的学习和指导价值。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6750027dfbd23cf8907224bf