国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

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

neu / 2974人閱讀

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

Iterator

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

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

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

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

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

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

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

遍歷完畢

為數(shù)組["a","b"]手動(dòng)寫(xiě)一個(gè)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};
    }
  };
}

等價(jià)于:

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

等價(jià)于:

iterator.next() 
= nextIndex

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

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

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

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

可遍歷對(duì)象

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

    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]()`
    
非可遍歷對(duì)象

對(duì)于非可遍歷對(duì)象,比如{a:1,b:2},ES6并沒(méi)有規(guī)定這種對(duì)象鍵值對(duì)為可遍歷對(duì)象,所以用for..of是不能對(duì)它進(jìn)行遍歷的.如果要使一個(gè)對(duì)象變成可遍歷的,需要手動(dòng)添加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 };
            }
          }
        };
      }
    };
    

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/111480.html

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

    mj 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

neu

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<