ECMAScript 2019: 如何使用迭代器和生成器
ECMAScript 是一种标准化的脚本语言,也就是 JavaScript 的标准化版本。每年都会有新的 ECMAScript 版本,其中包含了一些新的语言特性和功能。在 ECMAScript 2019 中,我们引入了迭代器和生成器这两个新的概念。
迭代器和生成器是一种遍历数据结构的方式,它们可以帮助我们更方便地处理数据。在本文中,我们将会详细介绍迭代器和生成器的概念以及如何使用它们来处理数据。
迭代器
迭代器是一种对象,它可以让我们遍历数据结构。在 JavaScript 中,迭代器是一个具有 next() 方法的对象,该方法返回一个包含 value 和 done 属性的对象。value 属性表示当前遍历到的值,done 属性表示是否已经遍历完了所有的值。
让我们来看一个例子:
const arr = [1, 2, 3]; const iterator = arr[Symbol.iterator](); console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.next()); // { value: 2, done: false } console.log(iterator.next()); // { value: 3, done: false } console.log(iterator.next()); // { value: undefined, done: true }
在上面的代码中,我们首先使用 arrSymbol.iterator 方法获取到了一个迭代器对象 iterator。然后,我们使用 next() 方法来遍历数组中的每个元素。当遍历完所有元素后,next() 方法会返回一个 done 属性为 true 的对象,表示已经遍历完了所有元素。
值得注意的是,数组、字符串、Set、Map 等数据结构都实现了 Symbol.iterator 方法,因此都可以通过该方法获取到迭代器对象。
生成器
生成器是一种特殊的函数,它可以让我们更方便地生成迭代器。在 JavaScript 中,生成器函数使用 function* 关键字声明,其内部可以使用 yield 关键字来暂停函数的执行,并返回一个值。
让我们来看一个例子:
// javascriptcn.com 代码示例 function* gen() { yield 1; yield 2; yield 3; } const iterator = gen(); console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.next()); // { value: 2, done: false } console.log(iterator.next()); // { value: 3, done: false } console.log(iterator.next()); // { value: undefined, done: true }
在上面的代码中,我们定义了一个生成器函数 gen,它使用 yield 关键字返回了三个值。然后,我们使用 gen() 方法获取到了一个迭代器对象 iterator。最后,我们使用 next() 方法遍历了生成器函数中返回的所有值。
除了使用 yield 关键字,生成器函数还可以使用 return 关键字来结束函数的执行,并返回一个指定的值。同时,生成器函数还支持使用 try-catch-finally 语句来捕获错误和清理资源。
总结
迭代器和生成器是 ECMAScript 2019 中引入的两个新概念,它们可以帮助我们更方便地遍历数据结构。迭代器是一种具有 next() 方法的对象,而生成器是一种特殊的函数,它可以使用 yield 关键字来暂停函数的执行,并返回一个值。我们可以使用迭代器和生成器来遍历数组、字符串、Set、Map 等数据结构,从而更方便地处理数据。
示例代码
// javascriptcn.com 代码示例 // 迭代器示例代码 const arr = [1, 2, 3]; const iterator = arr[Symbol.iterator](); console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.next()); // { value: 2, done: false } console.log(iterator.next()); // { value: 3, done: false } console.log(iterator.next()); // { value: undefined, done: true } // 生成器示例代码 function* gen() { yield 1; yield 2; yield 3; } const iterator = gen(); console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.next()); // { value: 2, done: false } console.log(iterator.next()); // { value: 3, done: false } console.log(iterator.next()); // { value: undefined, done: true }
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6569e720d2f5e1655d265172