javascript設計模式之迭代器模式
迭代器模式介紹
- 順序訪問一個集合
順序:如數(shù)組、類數(shù)組稱為順序,而非對象,能從0,1,2…通過index訪問的值
- 使用者無需知道集合的內部結構
示例
如果要對這三個變量進行遍歷,需要寫三個遍歷方法
<p>each1</p> <p>each2</p> <p>each3</p> ... <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script> <script> var arr = [1,2,3] var nodeList = document.getElementsByTagName('p') var $p = $('p') // 如果要對這三個變量進行遍歷,需要寫三個遍歷方法 // 1 arr.forEach(function(item){ console.log(item) }) // 2 var i;length = nodeList.length for(i = 0;i < length;i ++) { console.log(nodeList(i)) } // 3 $p.each(function(key, p){ console.log(key,p) }) </script>
如果寫成一個遍歷方法,拿jquery的$.each舉例,則這種方法稱為迭代器模式
// 如果寫成一個遍歷方法,拿jquery的$.each舉例,則這種方法稱為迭代器模式 var arr = [1,2,3] var nodeList = document.getElementsByTagName('p') var $p = $('p') function each(data){ var $data = data $data.each(function(key, val){ console.log(key, val) }) } each(arr) each(nodeList) each($p)
迭代器模式UML類圖
UML類圖: 用圖的方式表示各個類所有的屬性及相互之間的引用、繼承關系
迭代器模式原生代碼演示
class Iterator { constructor(conatiner) { this.list = conatiner.list this.index = 0 } next() { if (this.hasNext()) { return this.list[this.index++] } return null } hasNext() { if (this.index >= this.list.length) { return false } return true } } class Container { constructor(list) { this.list = list } getIterator() { return new Iterator(this) } } // 測試代碼 let container = new Container([1, 2, 3, 4, 5]) let iterator = container.getIterator() while(iterator.hasNext()) { console.log(iterator.next()) }
迭代器模式的場景
- jquery each
- ES6 Iterator
ES6 語法中,有序集合的數(shù)據(jù)類型已經(jīng)有很多,例如
- Array
- Map
- Set
- String
- Arguments
- NodeList
- 以上數(shù)據(jù)類型都有[Symbol.iterator]屬性,Symbol.iterator理解成唯一的key即可,屬性值是一個函數(shù),執(zhí)行函數(shù)返回一個迭代器,這個迭代器就有next方法可順序迭代子元素
- 通過Array.prototype[Symbol.iterator]來測試迭代器
- object不是有序集合,可以用Map來代替
ES6 Iterator示例
let arr = [1, 2, 3, 4] let nodeList = document.getElementsByTagName('p') let m = new Map() m.set('a', 100) m.set('b', 200) function each(data) { // 生成遍歷器 let iterator = data[Symbol.iterator]() let item = {done: false} while (!item.done) { item = iterator.next() if (!item.done) { console.log(item.value) } } } each(arr) each(nodeList) each(m)
由于Symbol.iterator屬性并不是人所知,同時并是每次用到它是都需要封裝一個each方法,因此有了es6新語法for…of語法,以上代碼可以這樣寫
function each(data) { for (let item of data) { console.log(item) } } each(arr) each(nodeList) each(m)
擴展
ES6 Iterator與Generator Iterator的價值不限于上述的幾種類型遍歷還有Generator函數(shù)的使用即返回的數(shù)據(jù)只要符合Iterator接口的要求(存在Symbol.iterator屬性),就可以使用Iterator語法,即迭代器模式
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
使用js聲明數(shù)組,對象在jsp頁面中(獲得ajax得到json數(shù)據(jù))
使用js聲明數(shù)組,對象在jsp頁面中(獲得ajax得到json數(shù)據(jù))。需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11Javascript基礎_簡單比較undefined和null 值
下面小編就為大家?guī)硪黄狫avascript基礎_簡單比較undefined和null 值。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06JavaScript入門教程(9) Document文檔對象
Document文檔對象是JavaScript中window和frames對象的一個屬性,是顯示于窗口或框架內的一個文檔。2009-01-01