ES6的迭代器和生成器

2021-10-11 02:19:00 字數 2610 閱讀 4351

在es6之前,遍歷陣列都需要使用for迴圈,通過變數來跟蹤陣列的索引。如果多個迴圈巢狀就需要追蹤多個變數,**複雜度會大大增加,也容易產生錯用迴圈變數的bug。

es6 引入了乙個全新的迭代器的概念,它提供一種方法能夠順序訪問乙個聚合物件中的各個元素,而不需要暴露該物件的內部表現。

es6 對迭代器物件的定義是:實現了next方法的物件,其中next方法返回乙個物件,這個物件包含兩個屬性,分別是done和value.

symbol.iterator es6新增

es6中原生的迭代器有array、set、map和string,for…of能夠遍歷它們是因為它們具有symbol.iterator屬性該屬性指向該資料結構的預設迭代器方法,當使用for…of…迭代該資料結構時js引擎就會呼叫其symbol.iterator方法,從而返回相應的預設迭代器。舉例:

let arr =[1

,2,4

,6];

//也可以使用es6提供的next()方法手工遍歷

let iterator = arr[symbol.iterator]()

;console.

log(iterator.

next()

);// console.

log(iterator.

next()

);// console.

log(iterator.

next()

);// console.

log(iterator.

next()

);// console.

log(iterator.

next()

);// 來檢測物件是否為可迭代的物件

let arr =

;//true

let obj =

;//true

let str ='';

//true

let map =

newmap()

;//true

letset

=new

set();

//true

let num =

123;

//false

console.

log(

typeof num[symbol.iterator]);

let isiterator1 =

typeof arr[symbol.iterator]

==="function"

;let isiterator2 = object.prototype.tostring.

call

(num[symbol.iterator]

)===

"[object function]"

console.

log(isiterator1)

;

特點

當 done 為 true 時則遍歷結束

每當我們執行一次next()方法,就會返回乙個物件:

當資料較多時 可以使用 for-fo

模擬原始碼:

const obj =

}return}}

}};const it = items[symbol.iterator]()

; console.

log(it.

next()

);

for-of 是 es6 提供的行語法,它是和迭代器配合使用的,可以確保迭代的順序

for (const value of obj)
for…of 有哪些顯著的優點呢?

有著同 for…in 一樣的簡潔語法,但是沒有 for…in 那些缺點

不同於 foreach 方法,它可以與 break、continue 和 return 配合使用

提供了遍歷所有資料結構的統一操作介面

使用者自定義迭代器物件,需要維護內部狀態,迭代器物件越複雜,內部狀態越難維護。通過 generators 可以簡化迭代器物件的定義,使用者只需要定義乙個函式,這個函式會自己維護內部狀態。這個函式需要滿足兩個條件:

使用 function*

使用至少乙個yield表示式

generator函式 可以通過yield關鍵字 將函式掛起,為改變執行流提供了可能,同時為了做非同步程式設計提供了方案。

後面 函式名之前有個*

//2.只能在函式內部使用yield表示式,讓函式掛起

function*fn

()// 原型的原型有next()方法

let fun =fn(

) console.

log(fun.

next()

) console.

log(fun.

next()

) console.

log(fun.

next()

)

總結:generator函式是分段執行的,yield語句是暫停執行,而next()是恢復執行

ES6中的生成器和迭代器

生成器函式generator function 用function name 來宣告,呼叫生成器函式則會返回乙個生成器物件generator,並且符合可迭代協議和迭代器協議,因此generator也是乙個迭代器物件,具有next 方法,呼叫next 方法會執行生成器函式內的語句 即遍歷生成器函式內部...

ES6中的迭代器和生成器

什麼是迭代器 迭代器是一種特殊物件,它具有一些專門為迭代過程設計的專有介面,所有的迭代器物件都有乙個next 方法,每次呼叫都返回乙個結果物件。結果物件有兩個屬性 乙個是value,表示下乙個將要返回的值 另乙個是done,它是乙個布林型別的值,當沒有更多可返回資料時返回true。迭代器還會儲存乙個...

深入理解ES6的迭代器與生成器

迴圈語句的問題 var colors red green blue for var i 0 i 在es6之前,這種標準的for迴圈,通過變數來跟蹤陣列的索引。如果多個迴圈巢狀就需要追蹤多個變數,複雜度會大大增加,也容易產生錯用迴圈變數的bug。迭代器的出現旨在消除這種複雜性並減少迴圈中的錯誤。什麼是...