1.什麼是Iteratores6
遍歷器(Iterator)它是一種接口,爲各類不一樣的數據結構提供統一的訪問機制。任何數據結構只要部署 Iterator接口,就能夠完成遍歷操做(即依次處理該數據結構的全部成員)。數組
2.Iterator的做用bash
Iterator 的做用有三個:一是爲各類數據結構,提供一個統一的、簡便的訪問接口;二是使得數據結構的成員可以按某種次序排列;三是ES6創造了一種新的遍歷命令for...of循環,Iterator 接口主要供for...of消費。數據結構
3.過程函數
(1)建立一個指針對象,指向當前數據結構的起始位置。也就是說,遍歷器對象本質上,就是一個指針對象。ui
(2)第一次調用指針對象的next方法,能夠將指針指向數據結構的第一個成員。spa
(3)第二次調用指針對象的next方法,指針就指向數據結構的第二個成員。prototype
(4)不斷調用指針對象的next方法,直到它指向數據結構的結束位置。指針
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};
}
};
}
/*
每一次調用next方法,都會返回數據結構的當前成員的信息。
具體來講,就是返回一個包含value和done兩個屬性的對象。
其中,value屬性是當前成員的值,done屬性是一個布爾值,表示遍歷是否結束。
*/
複製代碼
4.默認 Iterator 接口code
一個數據結構只要具備Symbol.iterator屬性,就能夠認爲是可遍歷的。
const obj = {
// Symbol是es6裏一個特殊的類型,因此放在[]裏。
[Symbol.iterator] : function () { // Symbol.iterator是一個方法
return { // 返回一個遍歷器對象
next: function () { // 遍歷器對象具備next方法
return { // 返回包含當前成員的對象
value: 1,
done: true
};
}
};
}
};
複製代碼
原生具有Iterator接口的數據類型有Array,Map,Set,String,TypedArray,函數的 arguments 對象,NodeList 對象。
對象(Object)之因此沒有默認部署 Iterator 接口,是由於對象的哪一個屬性先遍歷,哪一個屬性後遍歷是不肯定的,須要開發者手動指定。
// 類數組對象要具備iterator接口,簡單的辦法是
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
// 或者
NodeList.prototype[Symbol.iterator] = [][Symbol.iterator];
複製代碼
5.使用的場合
for ... of ...
數組的結構賦值
展開運算符 '...'
yield*
...
6.Iterator 接口與 Generator 函數
let myIterable = {
[Symbol.iterator]: function* () {
yield 1;
yield 2;
yield 3;
}
}
[...myIterable] // [1, 2, 3]
// 或者採用下面的簡潔寫法
let obj = {
* [Symbol.iterator]() {
yield 'hello';
yield 'world';
}
};
for (let x of obj) {
console.log(x);
}
// "hello"
// "world"
複製代碼
7.return()方法
return方法的使用場合是,若是for...of有循環出錯,或者有break語句,就會調用return方法。若是一個對象在完成遍歷前,須要清理或釋放資源,就能夠部署return方法。