ES6(迭代器Iterator和for...of循環(huán))

一、什么是Iterator接口

Iterator是帶有特殊接口的對象。含有一個 next()方法偏序,調(diào)用返回一個包含兩個屬性的對象续膳,分別是valuedone改艇,value表示當(dāng)前位置的值,done表示是否迭代完坟岔,當(dāng)為true的時候谒兄,調(diào)用next就無效了。

ES5中遍歷通常用for循環(huán)社付,數(shù)組還有 forEach 方法承疲,對象就是 for-in,ES6 中又添加了 MapSet 鸥咖,而迭代器可以統(tǒng)一處理所有集合數(shù)據(jù)的方法燕鸽。迭代器是一個接口,只要你這個數(shù)據(jù)結(jié)構(gòu)暴露了一個iterator的接口啼辣,那就可以完成迭代啊研。ES6創(chuàng)造了一種新的遍歷命令for...of循環(huán),Iterator接口主要供for...of消費鸥拧。

數(shù)據(jù)結(jié)構(gòu)只要部署了Iterator接口党远,我們就認(rèn)為這種數(shù)據(jù)結(jié)構(gòu)為“可遍歷”(Iterable)。ES6 規(guī)定富弦,默認(rèn)的 Iterator 接口部署在數(shù)據(jù)結(jié)構(gòu)的 Symbol.iterator屬性沟娱,或者說,一個數(shù)據(jù)結(jié)構(gòu)只要具有 Symbol.iterator數(shù)據(jù)腕柜,就可以認(rèn)為是“可遍歷的”(iterable)济似。

可以供 for...of 消費的原生數(shù)據(jù)結(jié)構(gòu)

  • Array
  • Map
  • Set
  • String
  • TypedArray(一種通用的固定長度緩沖區(qū)類型,允許讀取緩沖區(qū)中的二進制數(shù)據(jù))函數(shù)中的 arguments 對象
  • NodeList 對象

可以發(fā)現(xiàn)上面的原生數(shù)據(jù)結(jié)構(gòu)中沒有對象Object

{
    let arr = ['hello', 'world'];
    let map = arr[Symbol.iterator]();
    console.log(map.next());// {value: "hello", done: false}
    console.log(map.next());// {value: "world", done: false}
    console.log(map.next());// {value: undefined, done: true}
}

這里直接調(diào)用數(shù)組的Symbol.iterator接口盏缤,這個接口其實是數(shù)組內(nèi)部已經(jīng)幫我們實現(xiàn)了砰蠢,所以我們可以直接調(diào)用,返回的是一個map蛾找,map有一個next方法

對象Object是沒有Iterator接口的娩脾,無法通過for...of的方式遍歷對象

{
    let obj = {
        start: [1, 3, 5],
        end: [2, 4, 6],
    };

    // Object 沒有 Iterator接口
    // 會報錯obj[Symbol.iterator] is not a function
    // for (let key of obj) {
    //     console.log(key);
    // }
}

那是否可以自定義一個Iterator接口呢?答案是可以的

{
    let obj = {
        start: [1, 3, 5],
        end: [2, 4, 6],
        [Symbol.iterator]() {
            let self = this;
            let index = 0;
            let arr = self.start.concat(self.end);
            let len = arr.length;

            return {
                next() {
                    if (index < len) {
                        return {
                            value: arr[index++],
                            done: false //是否結(jié)束 false還沒有結(jié)束
                        }
                    } else {
                        return {
                            value: arr[index++],
                            done: true //是否結(jié)束 true已經(jīng)結(jié)束
                        }
                    }
                }
            }
        }
    };

    for (let key of obj) {
        console.log(key)
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末打毛,一起剝皮案震驚了整個濱河市柿赊,隨后出現(xiàn)的幾起案子俩功,更是在濱河造成了極大的恐慌,老刑警劉巖碰声,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诡蜓,死亡現(xiàn)場離奇詭異,居然都是意外死亡胰挑,警方通過查閱死者的電腦和手機蔓罚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞻颂,“玉大人豺谈,你說我怎么就攤上這事」闭猓” “怎么了茬末?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盖矫。 經(jīng)常有香客問我丽惭,道長,這世上最難降的妖魔是什么辈双? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任责掏,我火速辦了婚禮,結(jié)果婚禮上湃望,老公的妹妹穿的比我還像新娘换衬。我一直安慰自己,他們只是感情好证芭,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布冗疮。 她就那樣靜靜地躺著,像睡著了一般檩帐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上另萤,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天湃密,我揣著相機與錄音,去河邊找鬼四敞。 笑死泛源,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忿危。 我是一名探鬼主播达箍,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铺厨!你這毒婦竟也來了缎玫?” 一聲冷哼從身側(cè)響起硬纤,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赃磨,沒想到半個月后筝家,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡邻辉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年溪王,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片值骇。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡莹菱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吱瘩,到底是詐尸還是另有隱情道伟,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布搅裙,位于F島的核電站皱卓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏部逮。R本人自食惡果不足惜娜汁,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兄朋。 院中可真熱鬧掐禁,春花似錦、人聲如沸颅和。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峡扩。三九已至蹭越,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間教届,已是汗流浹背响鹃。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留案训,地道東北人买置。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像强霎,于是被迫代替她去往敵國和親忿项。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355