Iterator概念
JavaScript原有的表示“集合”的數(shù)據(jù)結(jié)構(gòu),主要是數(shù)組(Array)和對象(Object),es6又添加了Map和Set 。這樣就有了四種數(shù)據(jù)集合,而且我們還可以自由的組合使用它們,比如數(shù)組成員中有map,map成員有對象。這樣就需要一種統(tǒng)一接口機(jī)制來處理所有不同的數(shù)據(jù)結(jié)構(gòu)。遍歷器(Iterator)就是這樣一種機(jī)制。他是一種接口,為各種不同的數(shù)據(jù)結(jié)構(gòu)提供統(tǒng)一的訪問機(jī)制。
任何數(shù)據(jù)結(jié)構(gòu),只要部署了
Iterator接口就可以完成遍歷操作(即依次處理該數(shù)據(jù)結(jié)構(gòu)的所有成員)
Iterator 接口的作用
- 為各種數(shù)據(jù)結(jié)構(gòu)提供一個統(tǒng)一的、漸變的訪問接口;
- 使得數(shù)據(jù)結(jié)構(gòu)的成員能夠按某種測序排列;
- 供
for...of(es6遍歷命令)消費。
- 創(chuàng)建一個指針對象,指向當(dāng)前位置的起始位置。也就是說,遍歷器對象本質(zhì)上就是一個指針對象。
- 第一次調(diào)用指針對象的
next方法,可以將指針指向數(shù)據(jù)結(jié)構(gòu)的第一個成員。- 第二次調(diào)用指針對象的
next方法,指針就指向數(shù)據(jù)結(jié)構(gòu)的第二個成員。- 不斷調(diào)用指針的
next方法,直到它指向數(shù)據(jù)結(jié)構(gòu)的結(jié)束位置。
Iterator接口模擬
var it = makeIterator(['a', 'b']);
it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }
function makeIterator(array) {
var nextIndex = 0;
return {
next: function() {
return nextIndex < array.length ?
{value: array[nextIndex++], done: false} :
{value: undefined, done: true};
}
};
}