Generator函式和可迭代物件相關概念

2022-07-22 04:18:07 字數 2600 閱讀 9441

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 ...