1.呼叫乙個生成器函式,並不會馬上執行它裡面的語句,而是返回這個生成器的迭代器(iterator)物件。
2.呼叫迭代器的next()
方法,會執行到第乙個出現yield
的位置,返回yield
後面的值,然後暫停。如果遇到yield*,則執行權移交給另外乙個生成器函式(當前的暫停)。
3.next()
方法的返回值為乙個物件()。
4.next()
方法可以傳參,引數值作為上一條yield表示式的返回值。
function* gen()
var g = gen();
console.log(g.next()); //
console.log(g.next()); //
console.log(g.next('nice')); //
console.log(g.next()); //
5.return
語句會導致生成器立即變為完成狀態,使用next()
返回的物件的done為true,return
後面的返回值作為當前next()
返回的value值。
function* gen()
var g = gen();
console.log(g.next()) //
console.log(g.next()) //
console.log(g.next()) //
6.生成器也可以接收引數。
function* idmaker()
var gen = idmaker(4);
console.log(gen.next().value) //4
console.log(gen.next().value) //5
7.yield*
的使用。
function* anothergenerator(i)
function* generator(i)
var gen = generator(10);
console.log(gen.next()); //10
console.log(gen.next()); //11
console.log(gen.next()); //12
console.log(gen.next()); //20
8.生成器函式的經典應用——多維陣列扁平化。
var arr = [[1, 2, 2],[3, 4, 5, 5],[6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
function* flat(array) else
}}var gen = flat(arr);
var flatarr = [...gen];
console.log(flatarr)
//[1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]
1.內建可迭代物件有:string、array、typedarray、set、map。
2.要想成為可迭代物件,必須實現@@iterator
方法。意味著物件(或它原型鏈上的某個物件)必須有乙個鍵為@@iterator
的屬性,可以通過常量symbol.iterator
訪問該屬性。下面是自定義可迭代物件的例子。
var myiterable = {};
myiterable[symbol.iterator] = function* ()
console.log([...myiterable]) //[1, 2]
3.當乙個物件需要被迭代的時候(比如被置入乙個for...of
迴圈),首先會不帶引數呼叫它的@@iterator
方法,然後用此方法返回的迭代器獲取要迭代的值。
4.可以通過提供自己的@@iterator
方法,重新定義內建可迭代物件的預設迭代行為。
var mystring = new string('hi');
mystring[symbol.iterator] = function ()
} else }}
}}console.log([...mystring]); //[hello]
console.log(mystring + ''); //hi
5.for...of
迴圈、展開語法、yield*
、和解構賦值,都需要可迭代物件。
6.生成器物件(生成器函式的返回值)既是乙個迭代器,也是乙個可迭代物件。
迭代物件 和 Generator
其實就是乙個迭代邏輯,完全可定製,規定了迭代什麼,返回什麼,如何迭代等等資訊 表示可被迭代的物件,具體來說就是實現了 symbol.iterator 方法的物件 一般可以在乙個陣列的原型中找到 symbol.iterator 方法 陣列本身是實現了迭代器的 擁有 symbol.iterator 方法...
迭代函式 Generator函式的理解
一 基本用法 generator函式跟普通函式在寫法上的區別就是,多了乙個星號 並且只有在generator函式中才能使用yield 什麼是yield呢,他相當於generator函式執行的中途暫停點,比如下方有3個暫停點。而怎麼才能暫停後繼續走呢?那就得使用到next方法,next方法執行後會返回...
迭代器和可迭代
所有的迭代器都是可迭代的 迭代器模式 實現乙個自定義的迭代器模式需要兩個類,分別為實現了 iter 方法的類和通過 iter 返回的迭代器例項類 實現了 iter 和 next 方法 下面例子簡單實現了上述功能。12 3456 78910 1112 1314 1516 1718 1920 2122 ...