摘要:任何數(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
摘要:任何數(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...
摘要:任何數(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...
摘要:搞這么神秘其實(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ù)體拆成完全...
摘要:搞這么神秘其實(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ù)體拆成完全...
摘要:搞這么神秘其實(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ù)體拆成完全...
閱讀 3457·2021-11-17 17:00
閱讀 3818·2021-08-09 13:46
閱讀 2866·2019-08-30 15:54
閱讀 627·2019-08-30 13:54
閱讀 2945·2019-08-29 17:13
閱讀 3218·2019-08-29 14:00
閱讀 2975·2019-08-29 11:11
閱讀 1379·2019-08-26 10:15