????迭代是一種所有編程語言中都可以看到的模式舒岸。ECMAScript 6? 正式支持迭代模式并引用了兩個新的語言特性: 迭代器和生成器绅作。
? ? 迭代器是一個可以由任意對象實現(xiàn)的接口,支持連續(xù)獲取對象產出的每一個值蛾派。任何實現(xiàn)Iterable 接口的對象都有一個 Symbol.iterator 屬性,這個屬性引用默認迭代器。 默認迭代器就像一個迭代器工廠洪乍,也就是一個函數(shù)眯杏,調用之后會產生一個實現(xiàn)Iterator接口對象。
? ? 迭代器必須通過連續(xù)調用 next() 方法才能連續(xù)取得值壳澳, 這個方法返回一個IteratorObject岂贩。 這個對象包含一個done 屬性和一個value 屬性。 前者是一個布爾值巷波, 表示是否還有更多值可以訪問萎津;后者包含迭代器返回的當前值。
這個接口可以通過手動反復調用 next() 方法來消費抹镊, 也可以通過原生消費者锉屈, 比如 for-of 循環(huán)來自動消費 。
? ? 生成器是一種特殊的函數(shù)垮耳。 調用之后會返回一個生成器 颈渊。 生成器對象實現(xiàn)了Iterable 接口 , 因此可用在任何消費可迭代對象的地方终佛。 生成器 的獨特之處在于 支持 yield關鍵字俊嗽, 這個關鍵字能夠暫停執(zhí)行生成器函數(shù)。 使用yield 關鍵字還可以通過 next() 方法接收輸入和產出輸出铃彰。 在加上星號之后绍豁, yield 關鍵字可以將跟在它后面的可迭代對象序列化為一連串值。