Javascript 迭代器是什么
JavaScript迭代器是在ES6中引入的,用于循環(huán)一系列值,通常是某種集合。根據(jù)定義,迭代器必須實現(xiàn)
next()函數(shù),該函數(shù)以{value,done}的形式返回對象,其中value是迭代序列中的下一個值,done是一個布爾值,用于確定序列是否已被使用.
A very simple iterator with practical use in a real-world project could be as follows:
// Javascript
class LinkedList {
constructor(data) {
this.data = data;
}
firstItem() {
return this.data.find(i => i.head);
}
findById(id) {
return this.data.find(i => i.id === id);
}
[Symbol.iterator]() {
let item = {next: this.firstItem().id};
return {
next: () => {
item = this.findById(item.next);
if(item) {
return {value: item.value, done: false};
}
return {value: undefined, done: true};
}
};
}
}
const myList = new LinkedList([
{id: 'a10', value: 'First', next: 'a13', head: true },
{id: 'a11', value: 'Last', next: null, head: false },
{id: 'a12', value: 'Third', next: 'a11', head: false },
{id: 'a13', value: 'Second', next: 'a12', head: false }
]);
for(let item of myList) {
console.log(item); // 'First', 'Second', 'Third', 'Last'
}
在上面的示例中,我們實現(xiàn)了一個LinkedList數(shù)據(jù)結構,它在內(nèi)部使用一個數(shù)據(jù)數(shù)組,其中每個項都有一個值,以及一些用于確定其在序列中位置的實現(xiàn)特定屬性。從這個類構造的對象在默認情況下是不可iterable的,因此我們通過使用符號.迭代器并對其進行設置,使返回的序列根據(jù)類的內(nèi)部實現(xiàn)按順序排列,而返回的項僅返回其值。
迭代器
另一方面,迭代器只是函數(shù),這意味著可以像調(diào)用任何其他函數(shù)一樣調(diào)用它們(例如,將迭代委托給現(xiàn)有迭代器),同時也不限于符號.迭代器名稱,允許我們?yōu)橥粚ο蠖x多個迭代器。下面是這些概念的一個例子:
class SpecialList {
constructor(data) {
this.data = data;
}
[Symbol.iterator]() {
return this.data[Symbol.iterator]();
}
values() {
return this.data
.filter(i => i.complete)
.map(i => i.value)
[Symbol.iterator]();
}
}
const myList = new SpecialList([
{complete: true, value: 'Lorem ipsum'},
{complete: true, value: 'dolor sit amet'},
{complete: false},
{complete: true, value: 'adipiscing elit'}
]);
for(let item of myList) {
console.log(item); // The exact data passed to the SpecialList constructor above
}
for(let item of myList.values()) {
console.log(item); // 'Lorem ipsum', 'dolor sit amet', 'adipiscing elit'
}
在本例中,我們使用數(shù)據(jù)對象的本機數(shù)組迭代器使
specialist iterable,返回數(shù)據(jù)數(shù)組的精確值。同時,我們還定義了一個values方法,它本身就是一個迭代器,使用數(shù)組.prototype.filter()和Array.prototype.map(),然后最終返回符號.迭代器對于結果,只允許對序列中的非空對象進行迭代,并且只返回每個對象的值。