1.理解迭代
2.理解可迭代物件
3.理解迭代器
前言
說到迭代器,在學習C++時一般只是使用auto iterator來遍歷一個容器,當時也就只把他當做一個通用指標,深入一點可能探討了一下迭代器失效原理之類的,但對這個東西其實一直是一種抽象的感官,今天就借著紅寶書來細細品讀一下這個東西,
1.理解迭代:
首先看一段紅寶書原話:
迭代的英文“iteration”源自拉丁文itero,意思是“重復”或“再來”,在軟體開發領域,“迭代”的意思是按照順序反復多次執行一段程式,通常會有明確的終止條件,
回圈是迭代機制的基礎,這是因為它可以指定迭代的次數,以及每次迭代要執行什么操作,每次回圈都會在下一次迭代開始之前完成,而每次迭代的順序都是實作定義好的,
上述內容可能很抽象,但如果把迭代換成一個詞理解就很簡單了,“遍歷”這個詞大家很熟悉,畢竟一接觸編程我們做過遍歷陣列,那如果我們把“迭代”直接換成“多次遍歷”來理解上段話,看是否符合以上定義,
首先“多次”肯定就滿足了上述反復執行,從上文指定迭代的次數也可以看出迭代是有一定次數的,再者,如果要實作遍歷,你要遍及每一個元素肯定就需要一定的順序,不然就會導致有的讀了多次,有的沒讀,所以遍歷也就滿足了上述的 每次迭代的順序都是實作定義好的,其三,遍歷的元素肯定是有限的,所以也滿足通常會有明確的終止條件,
但是把迭代直接當成多次遍歷其實也不妥,有的迭代方式不一定要訪問所有元素呀,所以多次遍歷只是迭代的一個子集,說成多次遍歷是因為大多數時候我們說做迭代也是指做遍歷,如果要準確地描述迭代,我們可以理解成重復多次地按照一定順序訪問元素,
2.為什么要引入迭代器以及抽象意義上的迭代器
比如我們要迭代陣列,或者說遍歷一個陣列,我們需要知道兩件事:1.按照什么順序依次訪問, 2.如何對一個元素進行訪問, 陣列很好辦到,索引從0到陣列長度-1依次訪問,并且通過[index]就可以實作訪問,但這不是一種通用的方法,因為并不是所有資料結構都具有順序,也不是所有資料結構都能用索引下標訪問,所以需要一個通用的工具來實作迭代,這個工具不僅封裝了對資料結構的進行遍歷的功能,并且他是通用的,提供了統一的使用介面,這樣不同的使用者不用區分這是哪個資料結構的工具,這里所說的工具就是迭代器,其實這也就是紅寶書中7.2迭代器模式所提及的:這種概念上的分離正是iterable和iterator的強大之處,現在你不用為寫方法遍歷發愁了,我寫好了一個專門的通用工具給你,只要你使用這個工具的一個介面就可以迭代了,雖然不同的資料結構我為你提供的工具不同,但提供的工具都有這個介面,只要用這個介面就行了,你也不用為了適配不同的資料結構還要去寫不同的方法了,
3.可迭代物件:
還是看一段紅寶書的原話:
實作iterable介面要求同時具備兩種能力:支持迭代的自我識別能力和創建實作Iterator介面的物件的能力,在ECMAScript中,這意味著必須暴露一個屬性作為“默認迭代器”,而且這個屬性必須使用特殊的Symbol.iterator作為鍵,這個默認迭代器屬性必須參考一個迭代器工廠函式,呼叫這個工廠函式必須回傳一個新迭代器,
這句話看完你可能有點懵,沒事,我給你翻譯一下:也就是說,你要讓你的物件是可迭代物件,那么你必須給你的物件添加一個[Symbol.iterator]屬性,屬性值是工廠函式,工廠函式負責回傳一個迭代器,所以可迭代物件就是 1.實作了迭代器功能的物件,也就是上文所說的支持迭代的自我識別能力,迭代器不就有這個能力嗎,2.實作了創建迭代器物件的功能,具體通過給[Symbol.iterator]屬性添加一個工廠函式創建,這個工廠函式進行創建,也就是上文的創建實作Iterator介面的物件的能力,
4.迭代器
這里直接通過紅寶書的例子來帶你具體看看什么是迭代器,并且也具體化解釋了上文的可迭代物件,
class Counter {
constructor(limit) {
this.count = 1;
this.limit = limt;
}
next() {
if (this.count <= this.limit) {
return { done: false, value: this.count++ };
} else {
return { done: true, value: undefined };
}
}
[symbol.iterator]() {
return this;
}
}
前文說過:必須給你的物件添加一個[Symbol.iterator]屬性,屬性值是工廠函式,工廠函式負責回傳一個迭代器,我們看例子中的[symbol.iterator]屬性,回傳的是本身,也就是說本身就是一個迭代器,也就是我們所說的迭代工具,而迭代工具要滿足提供一個封裝好的迭代介面,就是上面的next介面,
ps:這篇文章只是為了琳琳才寫
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/272896.html
標籤:其他
上一篇:JavaScript學習(十五)—內部樣式與外部樣式的修改與設定
下一篇:css定位體系(2)
