1. 迭代器与生成器介绍
迭代器是一种特殊对象,有一个next方法,每次调用next方法,都会返回一个对象,该对象包含 两个属性,一个是value, 表示返回的值。另一个是done,是一个布尔值,用来表示该迭代器是否 还有数据可以返回。
当一个对象实现了 Symbol.iterator 方法时,我们认为它是可迭代的。
一些内置的类型,如 Array,Map,Set,String,Int32Array,Uint32Array等都已经实现了各自 的 Symbol.iterator。
对象上的 Symbol.iterator 函数负责返回供迭代的值,即迭代器。
生成器是一种特殊的函数,Symbol.iterator 函数就是一个生成器函数,用于创建迭代器。
2. 迭代器与生成器实例
for..of 语句:
let someArray: [number, string, boolean] = [1, "string", false];
for (let entry of someArray) {
console.log(entry);
} // => 1, string, false
for..of 与for..in 语句:
let list = [7, 8, 9];
for (let i in list) {
console.log(i);
} // => "0", "1", "2",
for (let i of list) {
console.log(i);
} // => "7", "8", "9"
for..of 与 for..in 对比实例:
let pets: any = new Set(["Cat", "Dog", "Hamster"]);
pets["species"] = "mammals";
// for..in 可用于查看任何对象的属性
for (let pet in pets) {
console.log(pet); // => species
}
// for..of 关注对象的键对应的值
for (let pet of pets) {
console.log(pet); // => Cat, Dog, Hamster
}
生成代码实例:
// ts 代码
let numbers = [1, 2, 3];
for (let num of numbers) {
console.log(num);
}
// 生成 ES3 或 ES5 时
var numbers = [1, 2, 3];
for (var _i = 0, numbers_1 = numbers; _i < numbers_1.length; _i++) {
var num = numbers_1[_i];
console.log(num);
}
// 生成 ES6 时
let numbers = [1, 2, 3];
for (let num of numbers) {
console.log(num);
}
生成器函数实例:
// 生成器函数
function* foo(x: number) {
while (x >= 0) {
yield x;
x--;
}
return;
}
var it = foo(3);
console.log(it.next()); //{ value: 3, done: false }
console.log(it.next()); //{ value: 2, done: false }
console.log(it.next()); //{ value: 1, done: false }
console.log(it.next()); //{ value: 0, done: false }
console.log(it.next()); //{ value: undefined, done: true }
自定义可迭代类型实例:
// 自定义迭代器实例
class SortedArray {
*[Symbol.iterator]() {
yield 11;
yield 12;
yield 13;
}
}
const testingIterables = new SortedArray();
for (let item of testingIterables) {
console.log(item); // => 11, 12, 13
}
原文:https://www.cnblogs.com/JosephWong/p/13678283.html