JS中生成器和迭代器有什么区别?

59 阅读2分钟

生成器和迭代器是 JS 中用于处理集合数据的重要概念,它们有一些区别:

  1. 迭代器(Iterator) 迭代器是一个对象,它提供了一个统一的方式来遍历集合中的元素,比如数组、集合或者自定义数据结构。迭代器通常包含一个 next() 方法,每次调用该方法都会返回一个包含 value 和 done 属性的对象,value 表示当前迭代的值, done 是一个布尔值,表示迭代是否已经结束。
function createIterator(arr){
  let index = 0;
  return {
    next: function(){
      return index < arr.length ? { value:arr[index++],done:false }:{done:true};
    }
  }
}

const iterator = createIterator([1,2,3])
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()); // { done: true }
  1. 生成器(Generator)

生成器是一种特殊类型的函数,它使用 function* 声明,可以通过 yield 关键字多次暂停和恢复函数的执行。每次调用生成器函数时,都会返回一个迭代器对象,可以通过迭代器的 next() 方法控制生成器函数的执行,并获取生成器函数 yield 语句返回的值。

function* generate() {
  yield 1;
  yield 2;
  yield 3;
}

const generator = generate();
console.log(generator.next()); // { value:1, done: false }
console.log(generator.next()); // { value:2, done: false }
console.log(generator.next()); // { value:3, done: false }
console.log(generator.next()); // { value:undefined, done: true }

主要区别有:

  • 语法:生成器使用 function* 声明,而迭代器是一个对象。
  • 控制执行:生成器函数内部通过 yield 关键字可以暂停执行并返回值,而迭代器对象通过 next() 方法控制函数的执行。
  • 多次执行:生成器函数可以再调用时生成多个迭代器,每个迭代器都会从生成器函数的当前状态开始执行,而迭代器对象是一个单独的迭代序列。

总结:生成器是一种函数,用于创建可暂停和恢复执行的迭代器。通过 yield 控制函数执行,而迭代器是一个对象,用于管理数据集合的迭代访问,通过 next() 方法控制迭代过程。