摘要:任何數(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
摘要:任何數(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...
摘要:任何數(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...
摘要:搞這么神秘其實就是個迭代器的核心實際上就是一個,通過關(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ù)體拆成完全...
摘要:搞這么神秘其實就是個迭代器的核心實際上就是一個,通過關(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ù)體拆成完全...
摘要:搞這么神秘其實就是個迭代器的核心實際上就是一個,通過關(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ù)體拆成完全...
閱讀 3475·2021-11-17 17:00
閱讀 3840·2021-08-09 13:46
閱讀 2880·2019-08-30 15:54
閱讀 647·2019-08-30 13:54
閱讀 2959·2019-08-29 17:13
閱讀 3238·2019-08-29 14:00
閱讀 2990·2019-08-29 11:11
閱讀 1404·2019-08-26 10:15