摘要:任何數據結構只要部署接口,就可以完成遍歷操作即依次處理該數據結構的成員。的遍歷某個數據結構過程是這樣的比如對進行遍歷創建一個指針對象,指向當前數組的起始位置。
Iterator
這真是毅種循環
Iterator不是array,也不是set,不是map, 它不是一個實體,而是一種訪問機制,是一個用來訪問某個對象的接口規范,為各種不同的數據結構提供統一的訪問機制。任何數據結構只要部署Iterator接口,就可以完成遍歷操作(即依次處理該數據結構的成員)。
Iterator的遍歷某個數據結構過程是這樣的(比如對array進行遍歷)
創建一個指針對象,指向當前數組的起始位置。也就是說,遍歷器對象本質上,就是一個指針對象
第一次調用指針對象的next方法,可以將指針指向數據結構的第一個成員, 這時候的返回值是{value:array[0], done:false}
第二次調用指針對象的next方法,指針就指向數據結構的第二個成員,這時候的返回值是{value:array[1], done:false}
不斷調用指針對象的next方法,直到它指向數據結構的結束位置這時候的返回值是{value:array[array.length-1], done:true}
遍歷完畢
為數組["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所以當 var iterator = makeIterator(["a","b"])執行完,這時候makeIterator函數內部的nextIndex=0, 但由于makeIterator給外部變量iterator返回了一個引用{next:function(){xxx}},所以makeIterator函數無法關閉,現在處于內存泄漏狀態(函數的執行上下文環境沒有關閉啊我摔!),
執行完第一個iterator.next()的時候, 由于此時nextIndex=0, nextIndex
{value: array[nextIndex++], done: false},這一句實際等價于: 返回{value: array[nextIndex], done: false}然后nextIndex=nextIndex+1,現在nextIndex=1了 執行完第二個iterator.next()的時候, 由于此時nextIndex=1, nextIndex
{value: array[nextIndex++], done: false},這一句實際等價于: 返回{value: array[nextIndex], done: false}然后nextIndex=nextIndex+1,現在nextIndex=2了 執行完第三個iterator.next()的時候, 由于此時nextIndex=2, nextIndex
{value: undefined, done: true} 可遍歷對象
事實上,我們不需要手動寫array/set/map的Iterator接口了,因為ES6規定它們是可遍歷對象,所以對應的Iterator接口已經被添加到對應的Symbol.iterator屬性上了(所以這三種數據結構才能用keys(for..of)/values(for..of)/entries(for..of)/foreach這種方法進行遍歷),你可以通過如下方式來獲取
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并沒有規定這種對象鍵值對為可遍歷對象,所以用for..of是不能對它進行遍歷的.如果要使一個對象變成可遍歷的,需要手動添加Iterator規則接口到它的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 }; } } }; } };對于其他的不可遍歷對象(比如類數組對象),你可以手動在Symbol.iterator屬性上部署上手寫的Iterator接口(這樣你自己可以寫遍歷規則),也可以讓Symbol.iterator屬性直接指向array的Iterator接口(這樣就是用的數組的遍歷規則)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80210.html
摘要:任何數據結構只要部署接口,就可以完成遍歷操作即依次處理該數據結構的成員。的遍歷某個數據結構過程是這樣的比如對進行遍歷創建一個指針對象,指向當前數組的起始位置。 Iterator 這真是毅種循環 Iterator不是array,也不是set,不是map, 它不是一個實體,而是一種訪問機制,是一個用來訪問某個對象的接口規范,為各種不同的數據結構提供統一的訪問機制。任何數據結構只要部署Ite...
摘要:任何數據結構只要部署接口,就可以完成遍歷操作即依次處理該數據結構的成員。的遍歷某個數據結構過程是這樣的比如對進行遍歷創建一個指針對象,指向當前數組的起始位置。 Iterator 這真是毅種循環 Iterator不是array,也不是set,不是map, 它不是一個實體,而是一種訪問機制,是一個用來訪問某個對象的接口規范,為各種不同的數據結構提供統一的訪問機制。任何數據結構只要部署Ite...
摘要:搞這么神秘其實就是個迭代器的核心實際上就是一個,通過關鍵字能夠把函數體拆成完全可控執行片段,在函數體外部通過來對這些執行片段進行遍歷這和遍歷這些數據結構是一個道理只不過用來遍歷函數片段,而用來遍歷元素對生成器執行操作,進行生成器的入口開始執 Generator 搞這么神秘 其實就是個迭代器 Generator的核心實際上就是一個Iterator,通過yield關鍵字能夠把函數體拆成完全...
摘要:搞這么神秘其實就是個迭代器的核心實際上就是一個,通過關鍵字能夠把函數體拆成完全可控執行片段,在函數體外部通過來對這些執行片段進行遍歷這和遍歷這些數據結構是一個道理只不過用來遍歷函數片段,而用來遍歷元素對生成器執行操作,進行生成器的入口開始執 Generator 搞這么神秘 其實就是個迭代器 Generator的核心實際上就是一個Iterator,通過yield關鍵字能夠把函數體拆成完全...
摘要:搞這么神秘其實就是個迭代器的核心實際上就是一個,通過關鍵字能夠把函數體拆成完全可控執行片段,在函數體外部通過來對這些執行片段進行遍歷這和遍歷這些數據結構是一個道理只不過用來遍歷函數片段,而用來遍歷元素對生成器執行操作,進行生成器的入口開始執 Generator 搞這么神秘 其實就是個迭代器 Generator的核心實際上就是一個Iterator,通過yield關鍵字能夠把函數體拆成完全...
閱讀 3806·2023-04-25 19:07
閱讀 3553·2021-11-22 12:02
閱讀 3137·2021-10-12 10:11
閱讀 3907·2021-09-03 10:49
閱讀 2891·2019-08-30 13:21
閱讀 2997·2019-08-30 11:14
閱讀 2088·2019-08-29 15:40
閱讀 2872·2019-08-28 18:29