
4.3 產生器函式和產生器物件
|
121
function shuffleSongs(songs) {
return songs.slice().sort(() => Math.random() > 0.5 ? 1 : -1)
}
console.log([...playlist(shuffleSongs(['a', 'b']), 3)])
// <- ['a', 'b', 'b', 'a', 'a', 'b']
迭代器在 ES6 中是很重要的一項工具,它不僅可幫助我們降低程式碼間
的關聯性,還可解決之前一些難以實作的問題,例如:模糊處理一系列
歌曲的能力—不管序列為有限或無限量。這樣以某種程度相同的處理方
式,可讓有運用迭代器協議的程式碼看起來更為優雅。但它將未知的可
迭代物件轉換為陣列也會產生可能的風險,因為無窮迴圈會使你的應用
程式崩潰。
產生器是另一種建立可回傳迭代物件的函式的方式,且不需要明確地宣
告一個附有
Symbol.iterator
方法的物件實字。它可讓函式的實作更為
簡單,例如:第 112 頁第 4.2.2 節「無限量的序列」的
range
或
take
函
式,還有一些有趣的案例可參考使用。
4.3 產生器函式和產生器物件
產生器是 ES6 新的特徵功能。它運作的方式是,你可以宣告一個產生器
函式,函式會回傳產生器物件
g
。這些
g
物件可使用
Array.from(g)
、
[...g]
、或
for..of
迴圈進行迭代。產生器函式可允許宣告一個特殊的
iterator
迭代器,這種迭代器可暫停執行並保留其內容。 ...