成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

切圖崽的自我修養(yǎng)-[ES6] 迭代器Iterator淺析

neu / 2989人閱讀

摘要:任何數(shù)據(jù)結(jié)構(gòu)只要部署接口,就可以完成遍歷操作即依次處理該數(shù)據(jù)結(jié)構(gòu)的成員。的遍歷某個數(shù)據(jù)結(jié)構(gòu)過程是這樣的比如對進(jìn)行遍歷創(chuàng)建一個指針對象,指向當(dāng)前數(shù)組的起始位置。

Iterator

這真是毅種循環(huán)

Iterator不是array,也不是set,不是map, 它不是一個實體,而是一種訪問機制,是一個用來訪問某個對象的接口規(guī)范,為各種不同的數(shù)據(jù)結(jié)構(gòu)提供統(tǒng)一的訪問機制。任何數(shù)據(jù)結(jié)構(gòu)只要部署Iterator接口,就可以完成遍歷操作(即依次處理該數(shù)據(jù)結(jié)構(gòu)的成員)。

Iterator的遍歷某個數(shù)據(jù)結(jié)構(gòu)過程是這樣的(比如對array進(jìn)行遍歷)

創(chuàng)建一個指針對象,指向當(dāng)前數(shù)組的起始位置。也就是說,遍歷器對象本質(zhì)上,就是一個指針對象

第一次調(diào)用指針對象的next方法,可以將指針指向數(shù)據(jù)結(jié)構(gòu)的第一個成員, 這時候的返回值是{value:array[0], done:false}

第二次調(diào)用指針對象的next方法,指針就指向數(shù)據(jù)結(jié)構(gòu)的第二個成員,這時候的返回值是{value:array[1], done:false}

不斷調(diào)用指針對象的next方法,直到它指向數(shù)據(jù)結(jié)構(gòu)的結(jié)束位置這時候的返回值是{value:array[array.length-1], done:true}

遍歷完畢

為數(shù)組["a","b"]手動寫一個iterator接口

var itertaor = makeIterator(["a", "b"]);

iterator.next() // { value: "a", done: false }
iterator.next() // { value: "b", done: false }
iterator.next() // { value: undefined, done: true }

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

等價于:

let iterator =     
makeIterator(["a","b"])=
{next:function(){xxxx}}

等價于:

iterator.next() 
= nextIndex

所以當(dāng) var iterator = makeIterator(["a","b"])執(zhí)行完,這時候makeIterator函數(shù)內(nèi)部的nextIndex=0, 但由于makeIterator外部變量iterator返回了一個引用{next:function(){xxx}},所以makeIterator函數(shù)無法關(guān)閉,現(xiàn)在處于內(nèi)存泄漏狀態(tài)(函數(shù)的執(zhí)行上下文環(huán)境沒有關(guān)閉啊我摔!),

執(zhí)行完第一個iterator.next()的時候, 由于此時nextIndex=0, nextIndex{value: array[nextIndex++], done: false},這一句實際等價于: 返回{value: array[nextIndex], done: false}然后nextIndex=nextIndex+1,現(xiàn)在nextIndex=1了

執(zhí)行完第二個iterator.next()的時候, 由于此時nextIndex=1, nextIndex{value: array[nextIndex++], done: false},這一句實際等價于: 返回{value: array[nextIndex], done: false}然后nextIndex=nextIndex+1,現(xiàn)在nextIndex=2了

執(zhí)行完第三個iterator.next()的時候, 由于此時nextIndex=2, nextIndex{value: undefined, done: true}

可遍歷對象

事實上,我們不需要手動寫array/set/map的Iterator接口了,因為ES6規(guī)定它們是可遍歷對象,所以對應(yīng)的Iterator接口已經(jīng)被添加到對應(yīng)的Symbol.iterator屬性上了(所以這三種數(shù)據(jù)結(jié)構(gòu)才能用keys(for..of)/values(for..of)/entries(for..of)/foreach這種方法進(jìn)行遍歷),你可以通過如下方式來獲取

    let arr = ["a", "b", "c"];
    let arrIterator = `arr[Symbol.iterator]()`
    
    
    let set = new Set([1,2,3]);
    let setIterator = `set[Symbol.iterator]()`
    
    let map = new Map([x,1][y,2]);
    let mapIterator = `map[Symbol.iterator]()`
    
非可遍歷對象

對于非可遍歷對象,比如{a:1,b:2},ES6并沒有規(guī)定這種對象鍵值對為可遍歷對象,所以用for..of是不能對它進(jìn)行遍歷的.如果要使一個對象變成可遍歷的,需要手動添加Iterator規(guī)則接口到它的Symbol.iterator屬性上去,比如

    let obj = {
      data: [ "hello", "world" ],
      [Symbol.iterator]() {
        const self = this;
        let index = 0;
        return {
          next() {
            if (index < self.data.length) {
              return {
                value: self.data[index++],
                done: false
              };
            } else {
              return { value: undefined, done: true };
            }
          }
        };
      }
    };
    

對于其他的不可遍歷對象(比如類數(shù)組對象),你可以手動在Symbol.iterator屬性上部署上手寫的Iterator接口(這樣你自己可以寫遍歷規(guī)則),也可以讓Symbol.iterator屬性直接指向array的Iterator接口(這樣就是用的數(shù)組的遍歷規(guī)則)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/111480.html

相關(guān)文章

  • 切圖崽的自我修養(yǎng)-[ES6] 迭代Iterator淺析

    摘要:任何數(shù)據(jù)結(jié)構(gòu)只要部署接口,就可以完成遍歷操作即依次處理該數(shù)據(jù)結(jié)構(gòu)的成員。的遍歷某個數(shù)據(jù)結(jié)構(gòu)過程是這樣的比如對進(jìn)行遍歷創(chuàng)建一個指針對象,指向當(dāng)前數(shù)組的起始位置。 Iterator 這真是毅種循環(huán) Iterator不是array,也不是set,不是map, 它不是一個實體,而是一種訪問機制,是一個用來訪問某個對象的接口規(guī)范,為各種不同的數(shù)據(jù)結(jié)構(gòu)提供統(tǒng)一的訪問機制。任何數(shù)據(jù)結(jié)構(gòu)只要部署Ite...

    springDevBird 評論0 收藏0
  • 切圖崽的自我修養(yǎng)-[ES6] 迭代Iterator淺析

    摘要:任何數(shù)據(jù)結(jié)構(gòu)只要部署接口,就可以完成遍歷操作即依次處理該數(shù)據(jù)結(jié)構(gòu)的成員。的遍歷某個數(shù)據(jù)結(jié)構(gòu)過程是這樣的比如對進(jìn)行遍歷創(chuàng)建一個指針對象,指向當(dāng)前數(shù)組的起始位置。 Iterator 這真是毅種循環(huán) Iterator不是array,也不是set,不是map, 它不是一個實體,而是一種訪問機制,是一個用來訪問某個對象的接口規(guī)范,為各種不同的數(shù)據(jù)結(jié)構(gòu)提供統(tǒng)一的訪問機制。任何數(shù)據(jù)結(jié)構(gòu)只要部署Ite...

    happyfish 評論0 收藏0
  • 切圖崽的自我修養(yǎng)-[ES6] 生成Generator淺析

    摘要:搞這么神秘其實就是個迭代器的核心實際上就是一個,通過關(guān)鍵字能夠把函數(shù)體拆成完全可控執(zhí)行片段,在函數(shù)體外部通過來對這些執(zhí)行片段進(jìn)行遍歷這和遍歷這些數(shù)據(jù)結(jié)構(gòu)是一個道理只不過用來遍歷函數(shù)片段,而用來遍歷元素對生成器執(zhí)行操作,進(jìn)行生成器的入口開始執(zhí) Generator 搞這么神秘 其實就是個迭代器 Generator的核心實際上就是一個Iterator,通過yield關(guān)鍵字能夠把函數(shù)體拆成完全...

    Dogee 評論0 收藏0
  • 切圖崽的自我修養(yǎng)-[ES6] 生成Generator淺析

    摘要:搞這么神秘其實就是個迭代器的核心實際上就是一個,通過關(guān)鍵字能夠把函數(shù)體拆成完全可控執(zhí)行片段,在函數(shù)體外部通過來對這些執(zhí)行片段進(jìn)行遍歷這和遍歷這些數(shù)據(jù)結(jié)構(gòu)是一個道理只不過用來遍歷函數(shù)片段,而用來遍歷元素對生成器執(zhí)行操作,進(jìn)行生成器的入口開始執(zhí) Generator 搞這么神秘 其實就是個迭代器 Generator的核心實際上就是一個Iterator,通過yield關(guān)鍵字能夠把函數(shù)體拆成完全...

    李義 評論0 收藏0
  • 切圖崽的自我修養(yǎng)-[ES6] 生成Generator淺析

    摘要:搞這么神秘其實就是個迭代器的核心實際上就是一個,通過關(guān)鍵字能夠把函數(shù)體拆成完全可控執(zhí)行片段,在函數(shù)體外部通過來對這些執(zhí)行片段進(jìn)行遍歷這和遍歷這些數(shù)據(jù)結(jié)構(gòu)是一個道理只不過用來遍歷函數(shù)片段,而用來遍歷元素對生成器執(zhí)行操作,進(jìn)行生成器的入口開始執(zhí) Generator 搞這么神秘 其實就是個迭代器 Generator的核心實際上就是一個Iterator,通過yield關(guān)鍵字能夠把函數(shù)體拆成完全...

    mj 評論0 收藏0

發(fā)表評論

0條評論

neu

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<