目录
1、迭代器(Iterator)
通过使用 next()
方法实现了迭代器协议的任何一个对象,该方法返回具有两个属性的对象:
value:迭代序列的下一个值
done:如果迭代器能够生成序列中的下一个值,则返回 false
布尔值;
如果迭代器已将序列迭代完毕,则为 true
2、生成器(Generator )
使用function*
语法声明,并且可以使用yield
关键字来暂停和恢复函数的执行。每次调用生成器的next()
方法时,函数会从上次yield
的位置继续执行,直到遇到下一个yield
或函数结束。
3、可迭代对象
为了实现可迭代,对象必须实现 [Symbol.iterator]()
方法,可迭代对象(或其原型链中的任意一个对象)必须具有一个键值为 Symbol.iterator 的属性。
内置可迭代对象:
String、Array、TypedArray、Map 和 Set
用于可迭代对象的语法
for (let value of ["a", "b", "c"]) {
console.log(value);
}
// "a"
// "b"
// "c"
[..."abc"]; // ["a", "b", "c"]
function* gen() {
yield* ["a", "b", "c"];
}
gen().next(); // { value: "a", done: false }
[a, b, c] = new Set(["a", "b", "c"]);
a; // "a"
4、迭代器和生成器的区别
定义方式:迭代器通常是通过实现Symbol.iterator
方法来定义的,而生成器则是通过function*
语法声明的特殊函数。
执行方式:迭代器是通过调用next()
方法来逐个访问序列中的元素,而生成器则是通过yield
关键字来暂停和恢复函数的执行。
用途:迭代器主要用于遍历集合中的元素,而生成器则更适用于处理异步操作或按需生成数据序列。
灵活性:生成器相比迭代器提供了更高的灵活性,因为它可以在函数内部定义复杂的迭代逻辑,并且可以通过yield
和next()
方法的参数进行值的传递和接收。