迭代器和生成器

138 阅读1分钟

OIP-C.jfif

迭代器对象

迭代器对象顾名思义就是一个对象,迭代器对象有一个next()方法,用它来实现迭代,next方法会返回一个对象,这个对象有两个属性分别为value和done;分别表示:这一步的next()迭代的值 和 迭代是否完成,没有完成返回false;当迭代完最后一项的时候返回的done是true。你要是自定义迭代器的话,就需要显示的维护其内部的状态,所以要谨慎的创建。可以选择调用生成器来创建迭代器

生成器函数

它允许你定义一个有自由迭代器算法的函数,同时会自己维护状态。刚开始调用生成器函数时,函数并不会执行任何操作,而是生成一个迭代器对象Generator(也叫做生成器对象),也是一个可迭代对象,假设生成器函数生成的生成器对象是obj,那么obj的[Symbol.iterator]是obj本身。也就是自身的迭代器是自身。生成器对象是严格的可迭代对象。

@@iterator(可迭代协议)

对象是否可以迭代要看是否满足可迭代协议,也就是是否有@@iterator属性,如果有这个属性就是可迭代的,如果没有就是不可迭代的。这个属性通过[Symbol.iterator]来访问。

有一些对象是内置可迭代属性的,比如Array,String,map,set等等。

有些对象不内置可迭代属性,但是我们可以通过自定义迭代器属性来实现它的迭代。因为调用生成器可以生成一个迭代器对象

 let p = {};
p[Symbol.iterator]=function*(){
    yield *[1,2,3]
};
console.log([...p])