迭代器(Iterators):
1. 迭代器协议:
迭代器协议定义了一个对象必须具备的 next 方法,该方法返回一个包含 value 和 done 属性的对象。
interface Iterator<T> {
next(): { value: T; done: boolean };
}
2. 可迭代对象:
实现了迭代器协议的对象被称为可迭代对象,它们具有一个 Symbol.iterator 方法,返回迭代器对象。
interface Iterable<T> {
[Symbol.iterator](): Iterator<T>;
}
3. 使用 for...of 遍历:
for...of 循环可以遍历实现了迭代器协议的可迭代对象。
let numbers = [1, 2, 3];
for (let num of numbers) {
console.log(num);
}
4. 自定义迭代器:
可以为对象创建自定义迭代器,实现 next 方法即可。
class MyIterator implements Iterator<number> {
private data: number[] = [1, 2, 3];
private index: number = 0;
next(): { value: number; done: boolean } {
if (this.index < this.data.length) {
return { value: this.data[this.index++], done: false };
} else {
return { value: 0, done: true };
}
}
}
let myIterator = new MyIterator();
for (let num of myIterator) {
console.log(num);
}
生成器(Generators):
1. 生成器函数:
生成器函数是一种特殊类型的函数,使用 function* 关键字声明,返回的是一个生成器对象。
function* simpleGenerator() {
yield 1;
yield 2;
yield 3;
}
let generator = simpleGenerator();
2. 生成器迭代器对象:
生成器函数返回的对象同时符合迭代器和可迭代对象的协议,具有 next 和 Symbol.iterator 方法。
interface Generator<T> extends Iterator<T> {
next(): { value: T; done: boolean };
[Symbol.iterator](): Generator<T>;
}
3. 使用生成器:
使用 next 方法迭代生成器函数的值,每次调用都会执行到下一个 yield。
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 }
4. 生成器的参数和返回值:
生成器函数可以接受参数,并且可以在 yield 语句中返回值。
function* generatorWithParams(start: number): Generator<number> {
for (let i = start; i < start + 3; i++) {
yield i;
}
}
let generator = generatorWithParams(5);
console.log(generator.next()); // 输出: { value: 5, done: false }
console.log(generator.next()); // 输出: { value: 6, done: false }
生成器提供了一种更简单和清晰的方式来定义迭代逻辑,特别是当处理异步代码时。它们可以帮助你更容易地表达和控制迭代流程。
转载请注明出处:http://www.zyzy.cn/article/detail/4704/TypeScript