生成器和迭代器是 JS 中用于处理集合数据的重要概念,它们有一些区别:
- 迭代器(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 }
- 生成器(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() 方法控制迭代过程。