002|JavaScript ES6新特性之迭代器

for...of

我們知道for...in可以用于遍歷對象屬性名key,而for...of則可以遍歷容器的value。我們通過下面的例子來比較一下:

let arr = [7, 8, 9];
arr.foo = 'James';

for (let i in arr) {
   console.log(i); // logs "0", "1", "2", "foo"
}

for (let i of arr) {
   console.log(i); // logs 7, 8, 9
}

迭代器

迭代器(iterator)一個是可以用于遍歷容器(如Array等)的對象。迭代器只有一個方法,next()。

next()

next將依次返回容器中的新值{value:xxx, done:false},直到遍歷完畢返回{done:true}

我們來看一下創(chuàng)建一個array的迭代器:

function makeIterator(array) {
    var nextIndex = 0;
    
    return {
       next: function() {
           return nextIndex < array.length ?
               {value: array[nextIndex++], done: false} :
               {done: true};
       }
    };
}

var it = makeIterator(['David', 'James']);
console.log(it.next().value); // 'David'
console.log(it.next().value); // 'James'
console.log(it.next().done);  // true

迭代協(xié)議

for..offor...in 有著本質(zhì)上的不同,隱藏于 for...of 背后的是原理是迭代協(xié)議。

迭代協(xié)議的涵義是,對象的System.iterator屬性應當是一個函數(shù),當調(diào)用后返回一個全新的迭代器。

當用for...of 遍歷一個object時它的工作流程如下:
1、獲取object的System.iterator屬性指向的函數(shù)。
2、調(diào)用該函數(shù),返回值為一個迭代器。
3、調(diào)用迭代器next()方法,得到value、done兩個值。
4、如果done為true,退出循環(huán)。
5、如果值done為false,則將value用于statements中,執(zhí)行for...of循環(huán)體。執(zhí)行完后返回3。

好了,完結(jié)。

什么是生成函數(shù)?

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容