首頁  >  文章  >  web前端  >  小議JavaScript中Generator和Iterator的使用_基礎知識

小議JavaScript中Generator和Iterator的使用_基礎知識

WBOY
WBOY原創
2016-05-16 15:48:151050瀏覽

一說到 Generator,大家就會扯上異步之類是話題。這顯然是被一些奇怪的東西帶壞了。與 Generator 關係密切的應該是 Iterator 才對,拿 Generator 來處理非同步也許是一些 C# 程式設計師才會想的事。當然這種用法確實有一套完整的東西,只是我個人不喜歡而已。
  非要把 Generator 和非同步連結上,唯一的點就是 next 的呼叫時機。因為 next 可以非同步地調用,所以 Generator 才得以被非同步地濫用。
  但我覺得 next 這個方法雖然可以非同步調用,但正確的使用方式應該是同步的。至少當一個 Generator 實例被用於 for-of 迴圈或 [...obj] 解構時都是連續呼叫 next 的。
  除了 next 的同非同步問題外,next 的參數也是個問題。由於 next 呼叫時傳入的參數會被當作 yield 運算子的回傳值,所以 generator 有了更豐富的使用方式。在早期的 python 中 yield 是語句而不是運算符,所以也不存在這樣的用法。後來的版本才把 yield 當作運算符,所以才出現了各種坑。
  把 Generator 實例當作 Iterator 時既不會非同步呼叫 next,也不會給 next 傳入參數。我覺得這才是 Generator 的正確用法。或者說穿了,Generator 就是用來實作 Iterator 的。至少 Generator 這個名字沒有別的意思了。下面是用法範例:
運行

<script>
var match = function * (pattern, string) {
 var regexp = new RegExp(pattern, 'g'); 
 for(let i; i = regexp.exec(string); yield i);
};

for(let i of match('a', 'abcabcabc')) {
 console.log(i);
}
</script>

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn