小議JavaScript中Generator和Iterator的使用
一說到 Generator,大家就會扯上異步之類是話題。這顯然是被一些奇奇怪怪的東西帶壞了。與 Generator 關(guān)系密切的應(yīng)該是 Iterator 才對,拿 Generator 來處理異步也許是一些 C# 程序員才會想的事。當然這種用法確實有一套完整的東西,只是我個人不喜歡而已。
非要把 Generator 和異步聯(lián)系上,唯一的點就是 next 的調(diào)用時機。因為 next 可以異步地調(diào)用,所以 Generator 才得以被異步地濫用。
但我覺得 next 這個方法雖然可以異步調(diào)用,但正確的使用方式應(yīng)該是同步的。至少當一個 Generator 實例被用于 for-of 循環(huán)或 [...obj] 解構(gòu)時都是連續(xù)調(diào)用 next 的。
除了 next 的同異步問題外,next 的參數(shù)也是個問題。由于 next 調(diào)用時傳入的參數(shù)會被作為 yield 運算符的返回值,所以 generator 有了更豐富的使用方式。在早期的 python 中 yield 是語句而不是運算符,所以也不存在這樣的用法。后來的版本才把 yield 作為運算符,所以才出現(xiàn)了各種坑。
把 Generator 實例作為 Iterator 時既不會異步調(diào)用 next,也不會給 next 傳入?yún)?shù)。我覺得這才是 Generator 的正確用法?;蛘哒f白了,Generator 就是用來實現(xiàn) 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>
相關(guān)文章
關(guān)于JavaScript對象類型之Array及Object
這篇文章主要介紹了關(guān)于JavaScript對象類型之Array及Object,Array 類型是 ECMAScript 中最常用的類型了。而且,ECMAScript 中的數(shù)組與其他多數(shù)語言中的數(shù)組有著相當大的區(qū)別,需要的朋友可以參考下2023-05-05
關(guān)于jQuery參考實例2.0 用jQuery選擇元素
本篇文章小編為大家介紹,關(guān)于jQuery參考實例2.0 用jQuery選擇元素,有需要的朋友可以參考一下。2013-04-04
JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊列
在面向?qū)ο蟮某绦蛟O(shè)計里,一般都提供了實現(xiàn)隊列(queue)和堆棧(stack)的方法,而對于JS來說,我們可以實現(xiàn)數(shù)組的相關(guān)操作,來實現(xiàn)隊列和堆棧的功能,看下面的相關(guān)介紹.2016-01-01

