ES6中的生成器和迭代器

2021-09-24 18:00:49 字數 2003 閱讀 6131

生成器函式generator function 用function *name () {}來宣告,呼叫生成器函式則會返回乙個生成器物件generator,並且符合可迭代協議和迭代器協議,因此generator也是乙個迭代器物件,具有next()方法,呼叫next()方法會執行生成器函式內的語句(即遍歷生成器函式內部的狀態,狀態值由yield後的表示式值給出)。

function *foo ( x ) 

var it = foo(3); // x = 3; 首次呼叫生成器函式返回乙個物件,具有next()方法的迭代器物件;

it.next().value; // 1 ;呼叫next方法來遍歷狀態,在遇到yield語句時停下來,返回具有形式的物件,其中value值是yield後的表示式值,done表示迭代是否結束;

it.next().value; // 2 第二次呼叫next方法,從上次yield停下來的地方繼續執行,注意上一次只執行yield及其表示式,如果yield表示式包含在語句中,則該語句不會執行,直到再次被啟動;

it.next(4).value; // undefined; y = 7; 第三次呼叫next方法時傳入乙個值,yield表示式可以接收值,也可以生成值,生成的值會被next方法返回,接受的值由next方法傳入作為整個yield表示式的值,所以此時y = 3 + 4; 然後繼續執行到下乙個yield處(var z = y + (yield) ),由於yield後沒有值,所以生成值為undefined;

it.next(5).value; // undefined; z = 12; 第四次呼叫next方法傳入5,可以得到z = 7 + 5; 執行到return結束,返回物件為;

每次呼叫生成器函式構建迭代器時,同時隱式構建了生成器例項,迭代器對應執行的是新的生成器例項,因此可以構建多個迭代器來控制對應生成器例項,互相之間並不會干擾。比如

function *bar () 

var it1 = bar();

var it2 = bar();

it1.next(); //

it2.next(); // ,並非

利用生成器例項的暫停執行機制,可以控制多個生成器函式交替執行,如果這些函式有共享的變數,則可以模仿多執行緒競態條件環境。

for of遍歷方法

典型的for of遍歷寫法for (let v of something),其中something是迭代器物件,或者具有[symbol.iterator]屬性的物件,如陣列,map集合和set集合,而v則是迭代器物件呼叫next方法返回物件的value屬性值;for of結構中迭代器物件自動呼叫next方法,直到返回物件的done屬性值為true;

如果生成器函式內部有無限多個狀態,如

function *foo ()  else 

yield nextval;

}}

利用for ( let v of foo())則會一直無限迴圈下去,那麼如何讓生成器停止呢?

給for of新增break、return語句;for of結構在遇到break、return或者有異常時,並非會掛起狀態,而是會向迭代器物件傳送乙個訊號使其終止;break和return會觸發執行生成器內部的finally語句;

var it = foo();

for ( let v of it ) ;

}}

注意:在可迭代物件(如陣列,map和set集合)中,迭代物件並沒有return方法,只有next方法,這一點跟生成器函式返回的迭代物件有區別;如

var arr = [1, 2, 500, 600,3, 4];

var it = arr[symbol.iterator]();

for(let v of it) }1

2 500

600

typeerror: it.return is not a function

ES6中的迭代器和生成器

什麼是迭代器 迭代器是一種特殊物件,它具有一些專門為迭代過程設計的專有介面,所有的迭代器物件都有乙個next 方法,每次呼叫都返回乙個結果物件。結果物件有兩個屬性 乙個是value,表示下乙個將要返回的值 另乙個是done,它是乙個布林型別的值,當沒有更多可返回資料時返回true。迭代器還會儲存乙個...

ES6的迭代器和生成器

在es6之前,遍歷陣列都需要使用for迴圈,通過變數來跟蹤陣列的索引。如果多個迴圈巢狀就需要追蹤多個變數,複雜度會大大增加,也容易產生錯用迴圈變數的bug。es6 引入了乙個全新的迭代器的概念,它提供一種方法能夠順序訪問乙個聚合物件中的各個元素,而不需要暴露該物件的內部表現。es6 對迭代器物件的定...

ES6中的Generator生成器

generator函式,可以通過yield關鍵字,將函式掛起,為了改變執行流提供了可能性,同時為了做非同步程式設計提供了方案 generator函式是分段執行的,yield是暫停執行,next 是恢復執行 1.function後面函式名之前有個 2.只能在函式內部使用yield表示式讓函式掛起,yi...