1、什么是迭代器(iterator)
迭代器是一種特殊物件,是為各資料結構的迭代程序設計的專有介面,迭代器物件都有一個next,方法,每一次呼叫next方法 , 都會回傳資料結構的當前成員的資訊,即回傳一個物件:
{done: Boolean, value: any}
value:當前成員的值,
done:布林值,表示遍歷是否結束,
這樣不斷呼叫next方法,直到遍歷結束,
//用ES5創建一個迭代器:
function createlterator(arr){
var i = 0;
return {
next: function(){
var done = (i >= arr.length);
var value = !done? arr[i++]:undefined;
return {
done: done,
value: value
}
}
}
}
var iterator = createlterator([1,2,3]);
console.log(iterator.next());
//{done: false, value: 1}
console.log(iterator.next());
// {done: false, value: 2}
console.log(iterator.next());
//{done: false, value: 3}
console.log(iterator.next());
//{done: true, value: undefined}
上述ES5的例子較復雜,ES6引入了生成器 Generator,它是一種以更簡單的方式創建迭代器的函式,該函式通過function后的星號"*"表示,使用內部專用關鍵字yield作為暫圖示識,yield后運算式的值即為迭代器next,回傳值中的value值,
//用ES6生成器創建一個迭代器:
function *createlterator(arr){
for (let i=O;i<arr.length;i++){
yield arr[i];
}
}
let iterator = createlterator([1,2,3]);
console.log(iterator.next());
// {done: false, value: 1}
console.log(iterator.next());
// {done: false, value: 2}
console.log(iterator.next());
//{done: false, value: 3}
console.log(iterator.next());
//{done: true, value: undefined}
當我們呼叫Generator函式時,并不會執行該函式,而是回傳一個迭代器,
當該迭代器呼叫next方法時,就會開始執行函式,在執行完第一句yield陳述句后自動暫停,并將yield
后的運算式的值作為其回傳值的value,當再次呼叫next方法時才會從上次停止的地方(yield [運算式]處的后面)開始繼續執行,直到執行
完下一句yield陳述句,
2、什么是可迭代物件(iterator)
如果物件含有Symbol.iterator屬性,就認為是可迭代的,Symbol.iterator本身是一 個函式,即當前資料結構的迭代器生成函式(生成器或es5函式),可以回傳一個作用于附屬物件的迭代器 , 常見 的Array, Map, Set, String, arguments 等都是原生可迭代物件 , 具有內置的Symbol.iterator屬性(生成器),ES6的for-of需要用到可迭代物件的該屬性,
3、for-of回圈機制
可迭代物件可以使用一些ES6方法,例如 for..of陳述句和擴展運算子(…),for-of在可迭代物件上創建一個迭代回圈,并為每個不同屬性的值執行陳述句,其原理是首先會呼叫[Symbol.iterator],方法,回傳一個迭代器物件,內含next,方法,然后重復呼叫 next,方法,回圈一次就呼叫一次并得到回傳值中的value,
4、訪問迭代器
//通過Symbol.iterator,來訪問可迭代物件的迭代器
let items = [1,2,3];
let iterator = items[Symbol.iterator]();
console.log(iterator.next());
// {done: false, value: 1}
console.log(iterator.next());
// {done: false, value: 2}
console.log(iterator.next());
// {done: false, value: 3}
console.log(iterator.next());
//{done: true, value: undefined}
5、普通物件變可迭代物件
一般開發中定義的物件都是不可迭代物件 ,不能使用 for - of ( 會報錯 : xx is not iterable),但如果給物件部署 Symbol.iterator屬性,添加一個生成器 (es5傳統生成函式也可以,但用生成器是 主流),可以使其變為可迭代物件,
let obj = {
"0":"aa",
"1":"bb",
"2":"cc"
}
obj[ Symbol.iterator ] = function *(){
for(let key in this){
let val = this[key];
yield val;
}
}
for(let i of obj){
console.log(i)
}
//aa
//bb
//cc
6、總結
迭代器:一種可以呼叫內部next方法進行 手動迭代的物件,
生成器:一種用來創建迭代器的函式,
可迭代物件:一種具有Symbol.iterator屬性或稱iterator介面的能被for of陳述句自動迭代的物件,Symbol.iterator屬性對應著一個迭代器生成函式,
另外:通過生成器(*)回傳的迭代器同時也是可迭代物件 , 因為生成器會默認為其添加 Symbol.iterator屬性,會回傳該迭代器本身,這樣可以讓一個迭代器也能被可迭代物件的語法(for of或展開符…)所應用,如果是用es5函式創建的迭代器 , 回傳時一般會自主添加 [Symbol.iterator]: function(){ return this },使其也成為可迭代物件,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/297860.html
標籤:其他
上一篇:箭頭函式=>
