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