05-es6-iterator(附教程)

學習教程(視頻):https://www.bilibili.com/video/BV1h7411u7a4?t=1635

概念

  • iterator是一種接口機制,為各種不同的數(shù)據(jù)結(jié)構(gòu)提供統(tǒng)一的訪問機制

作用

  1. 為各種數(shù)據(jù)結(jié)構(gòu),提供一個統(tǒng)一的,簡便的訪問接口;
  2. 使得數(shù)據(jù)結(jié)構(gòu)成員能夠按某種次序排列
  3. es6創(chuàng)造了一種新的遍歷命令for...of循環(huán),iterator接口主要提供for...of消費

執(zhí)行順序

1.創(chuàng)建一個指針對象,指向當前數(shù)據(jù)結(jié)構(gòu)的起始位置。也就是說,遍歷器對象本質(zhì)上,就是一個指針對象
2.第一次調(diào)用對象next()方法,指針指向數(shù)據(jù)結(jié)構(gòu)的第一個成員
3.第二次調(diào)用對象next()方法,指針指向數(shù)據(jù)結(jié)構(gòu)的第二個成員
4.不斷調(diào)用指針對象next()方法,直到它指向數(shù)據(jù)結(jié)構(gòu)的結(jié)束位置,done返回true(事件結(jié)束)

模擬iterator中next()方法

// 1.模擬next()
    {
        let it = makeIterator(['a','b','c']);
        function makeIterator(arr) {
            let nextIndex = 0;
            return {
                next:function() {
                    return nextIndex < arr.length ? {
                        value:arr[nextIndex++],
                        done:false
                    } : {
                        value:undefined,
                        done:true//done判斷是否結(jié)束,true表示結(jié)束返回undefined
                    }
                }
            }
            
        }
        console.log(it.next());//{value: "a", done: false}
        console.log(it.next());//{value: "b", done: false}
        console.log(it.next());//{value: "c", done: false}
        console.log(it.next());//{value: undefined, done: true}
        // next()方法返回一個對象,表示是當前成員的數(shù)據(jù)
        // 對象中包含兩個屬性,value表示值,done表示是否結(jié)束


    }

原生iterator接口

在控制臺測試Array( )是否支持iterator接口
new一個Array()實例arr1,查看arr1原型發(fā)現(xiàn)存在Symbol.iterator()函數(shù),如下圖:

image.png

那么arr實例如何使用iterator接口?只要實現(xiàn)Symbol.iterator()函數(shù)即可,這樣實例就有了iterator的next()方法->代碼如下:
1:

// 2.1 數(shù)組原型的iterator
    let arr = ['aa','bb','cc'];
    let it = arr[Symbol.iterator]();//執(zhí)行數(shù)組中iterator函數(shù)(接口),即可調(diào)用next()
    console.log(it.next());
    console.log(it.next());
    console.log(it.next());
    console.log(it.next());
    // 數(shù)組原型中有iterator,所以可以調(diào)用next()方法

實例arr實現(xiàn)iterator接口,即可使用next()方法,在控制臺打印效果:


image.png

因為arr只有3條數(shù)據(jù),所以前3次打印value可以獲得值,然后done為flase(沒有結(jié)束);第4次打印value為undefined拿不到值,done為true(已經(jīng)結(jié)束),沒有數(shù)據(jù)了

  1. 再看Map(),同理
// 2.2 Map原型的iterator
    let map = new Map();
    map.set('name','張三');
    map.set('name2','李四');
    let it2 = map[Symbol.iterator]();
    console.log(it2.next());
    console.log(it2.next());
    console.log(it2.next());
  1. 使用for... of循環(huán)
// 2.3 es6創(chuàng)造了一種新的遍歷命令for...of循環(huán),iterator接口主要提供for...of消費
    // 例子1
    let arr2 = ['aaa','bbb','ccc'];
    for(let v of arr2) {
        console.log(v)// aaa bbb ccc
    }

    // 例子2 arguments的iterator
    function fn() {
        for(let v of arguments) {
            console.log(v);//王五 趙六
        }
    }
    fn("王五","趙六");

支持iterator接口的數(shù)據(jù)結(jié)構(gòu)

Array Map Set String TypedArray 函數(shù)的arguments對象 NodeList對象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容