JS之ES6生成器

2022-07-18 20:21:27 字數 2487 閱讀 8705

generator(生成器)是 es6 標準引入的新的資料型別。乙個 generator 看上去像乙個函式,但可以返回多次

generator 函式和普通的函式區別有兩個, 1:function 和函式名之間有乙個*號, 2:函式體內部使用了 yield 表示式

呼叫生成器函式和呼叫 普通函式不同,呼叫生成器函式是返回乙個生成器物件(可迭代的物件)

// * 和 yield

function* gen()

let iter = gen(); // 建立生成器物件 iter(可迭代)

next()

呼叫 生成器物件的 next() 方法,才是真正開始執行生成器函式,每次遇到 yield 或者 return就會返回乙個物件

value表示 yield 或 return 後面的值。

done表示這個 物件是否已經結束(迭代到末尾了)

forof 迴圈

呼叫迭代器迴圈 生成器物件。可以直接獲取到 yield 後面的值。

擴充套件運算子

...生成器物件 也可以獲取 yield 後面的值。

【注 1】next()到 return 表示結束(沒有 return,其實是隱含了 return undefined),且 return 之後的 yield 不會被執行到

【注 2】done 到最後返回 true,表示結束

【注 3】return 不會被 forof 和擴充套件運算子遍歷到。所以只能用 next()獲取到 return 的值

function* gen() 

let iter = gen();

console.log(iter.next()); //

for (const i of iter)

console.log(...iter); //不用上面的forof,用擴充套件運算子得出的結果 和上面是一樣的

委託,可以委託給其他生成器或者可迭代物件

//其他生成器

function* g1()

function* g2()

var iterator = g2();

console.log(iterator.next()); //

console.log(iterator.next()); //

console.log(iterator.next()); //

console.log(iterator.next()); //

console.log(iterator.next()); //

console.log(iterator.next()); //

// 可迭代物件

function* g3()

var iterator = g3(5, 6);

console.log(iterator.next()); //

console.log(iterator.next()); //

console.log(iterator.next()); //

console.log(iterator.next()); //

console.log(iterator.next()); //

console.log(iterator.next()); //

console.log(iterator.next()); //

如果給 next 方法傳引數, 那麼這個引數將會作為上一次 yield 語句的返回值,這個特性在非同步處理中是非常重要的, 因為在執行非同步**以後, 有時候需要上乙個非同步的結果, 作為下次非同步的引數

function* foo(x) 

var a = foo(5);

console.log(a.next()); // 6

console.log(a.next()); // nan,由於這次next沒帶引數,相當於上乙個x+1為undefined,所以 y == 2 * undefined == nan

console.log(a.next()); // nan

var b = foo(5);

console.log(b.next()); // 6

console.log(b.next(12)); // 8

console.log(b.next(13)); // 42

ES6之生成器(Generator)

目錄 深入理解 新語法 yield 生成器與協程 通過一段程式,持續迭代或列舉出符合某個公式或演算法的有序數列中的元素。function fibo let generator fibo for let i 0 i 10 i 生成器函式和普通函式的語法差別在於,在 function 語句之後和函式名之...

ES6中的Generator生成器

generator函式,可以通過yield關鍵字,將函式掛起,為了改變執行流提供了可能性,同時為了做非同步程式設計提供了方案 generator函式是分段執行的,yield是暫停執行,next 是恢復執行 1.function後面函式名之前有個 2.只能在函式內部使用yield表示式讓函式掛起,yi...

ES6新特性之生成器函式 generator

一 什麼是生成器函式?生成器函式是es6的新特性之一,它是乙個在執行時能中途暫時退出,後面重新呼叫又能重新進入繼續執行的一種函式。並且在函式內定義的變數的所有狀態不受中途退出的影響。二 語法 宣告方式 function 函式名 引數1 引數2 引數n 呼叫說明 1 呼叫生成器物件時會返回乙個生成器的...