前面的話
用循環(huán)語句迭代數(shù)據(jù)時,必須要初始化一個變量來記錄每一次迭代在數(shù)據(jù)集合中的位置,而在許多編程語言中,已經開始通過程序化的方式用迭代器對象返回迭代過程中集合的每一個元素
迭代器的使用可以極大地簡化數(shù)據(jù)操作,于是ES6也向JS中添加了這個迭代器特性。新的數(shù)組方法和新的集合類型(如Set集合與Map集合)都依賴迭代器的實現(xiàn),這個新特性對于高效的數(shù)據(jù)處理而言是不可或缺的,在語言的其他特性中也都有迭代器的身影:新的for-of循環(huán)、展開運算符(...),甚至連異步編程都可以使用迭代器
本文將詳細介紹ES6中的迭代器(Iterator)和生成器(Generator)
引入
下面是一段標準的for循環(huán)代碼,通過變量i來跟蹤colors數(shù)組的索引,循環(huán)每次執(zhí)行時,如果i小于數(shù)組長度len則加1,并執(zhí)行下一次循環(huán)
var colors = ["red", "green", "blue"];for (var i = 0, len = colors.length; i < len; i++) { console.log(colors[i]);}雖然循環(huán)語句語法簡單,但如果將多個循環(huán)嵌套則需要追蹤多個變量,代碼復雜度會大大增加,一不小心就錯誤使用了其他for循環(huán)的跟蹤變量,從而導致程序出錯。迭代器的出現(xiàn)旨在消除這種復雜性并減少循環(huán)中的錯誤
迭代器
迭代器是一種特殊對象,它具有一些專門為迭代過程設計的專有接口,所有的迭代器對象都有一個next()方法,每次調用都返回一個結果對象。結果對象有兩個屬性:一個是value,表示下一個將要返回的值;另一個是done,它是一個布爾類型的值,當沒有更多可返回數(shù)據(jù)時返回true。迭代器還會保存一個內部指針,用來指向當前集合中值的位置,每調用一次next()方法,都會返回下一個可用的值
如果在最后一個值返回后再調用next()方法,那么返回的對象中屬性done的值為true,屬性value則包含迭代器最終返回的值,這個返回值不是數(shù)據(jù)集的一部分,它與函數(shù)的返回值類似,是函數(shù)調用過程中最后一次給調用者傳遞信息的方法,如果沒有相關數(shù)據(jù)則返回undefined
下面用ES5的語法創(chuàng)建一個迭代器
function createIterator(items) { var i = 0; return { next: function() { var done = (i >= items.length); var value = !done ? items[i++] : undefined; return { done: done, value: value }; } };}var iterator = createIterator([1, 2, 3]);console.log(iterator.next()); // "{ value: 1, done: false }"console.log(iterator.next()); // "{ value: 2, done: false }"console.log(iterator.next()); // "{ value: 3, done: false }"console.log(iterator.next()); // "{ value: undefined, done: true }"http:// 之后的所有調用console.log(iterator.next()); // "{ value: undefined, done: true }"在上面這段代碼中,createIterator()方法返回的對象有一個next()方法,每次調用時,items數(shù)組的下一個值會作為value返回。當i為3時,done變?yōu)閠rue;此時三元表達式會將value的值設置為undefined。最后兩次調用的結果與ES6迭代器的最終返回機制類似,當數(shù)據(jù)集被用盡后會返回最終的內容
新聞熱點
疑難解答
圖片精選