最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript設(shè)計模式之迭代器模式

 更新時間:2022年01月11日 14:27:10   作者:妖怪不慌不張  
這篇文章主要為大家介紹了javascript迭代器模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

迭代器模式介紹

  • 順序訪問一個集合

順序:如數(shù)組、類數(shù)組稱為順序,而非對象,能從0,1,2…通過index訪問的值

  • 使用者無需知道集合的內(nèi)部結(jié)構(gòu)

示例

如果要對這三個變量進(jìn)行遍歷,需要寫三個遍歷方法

<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')
// 如果要對這三個變量進(jìn)行遍歷,需要寫三個遍歷方法
// 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類圖: 用圖的方式表示各個類所有的屬性及相互之間的引用、繼承關(guān)系

在這里插入圖片描述

迭代器模式原生代碼演示

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)

擴(kuò)展

ES6 Iterator與Generator Iterator的價值不限于上述的幾種類型遍歷還有Generator函數(shù)的使用即返回的數(shù)據(jù)只要符合Iterator接口的要求(存在Symbol.iterator屬性),就可以使用Iterator語法,即迭代器模式

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 徹底理解js面向?qū)ο笾^承

    徹底理解js面向?qū)ο笾^承

    這篇文章主要介紹了js面向?qū)ο笾^承的相關(guān)知識,以及分享了讀者弄明白這個知識點(diǎn)的學(xué)習(xí)心得,對此有需要的朋友參考下吧。
    2018-02-02
  • Javascript基礎(chǔ)教程之if條件語句

    Javascript基礎(chǔ)教程之if條件語句

    這篇文章主要介紹了Javascript基礎(chǔ)教程之if條件語句,需要的朋友可以參考下
    2015-01-01
  • javascript 進(jìn)階篇1 正則表達(dá)式,cookie管理,userData

    javascript 進(jìn)階篇1 正則表達(dá)式,cookie管理,userData

    接下來開始我們的進(jìn)階之路,更實(shí)用的技巧分享
    2012-03-03
  • Javascript學(xué)習(xí)筆記3 作用域

    Javascript學(xué)習(xí)筆記3 作用域

    每個寫過程序的人都不會對作用域這個概念陌生,那在這篇文章中就來談下Javascript的作用域。
    2010-01-01
  • 使用UglifyJS合并/壓縮JavaScript的方法

    使用UglifyJS合并/壓縮JavaScript的方法

    在UglifyJS入門中主要記錄了UglifyJS的安裝,配置。篇末在命令行中使用了一個簡單命令來壓縮一個JS文件。這篇以編程的方式去壓縮JS文件。即寫一個build.js文件,使用node命令執(zhí)行該文件
    2012-03-03
  • 用JavaScript顯示瀏覽器客戶端信息的超相近教程

    用JavaScript顯示瀏覽器客戶端信息的超相近教程

    這篇文章主要介紹了用JavaScript顯示瀏覽器客戶端信息的超相近教程,包含了從返回桌面瀏覽器客戶端內(nèi)核信息到移動端瀏覽器以及其使用的系統(tǒng)版本信息等內(nèi)容,傾力推薦!需要的朋友可以參考下
    2015-06-06
  • fetch()函數(shù)說明與使用方法詳解

    fetch()函數(shù)說明與使用方法詳解

    fetch()是XMLHttpRequest的升級版,用于在JavaScript腳本里面發(fā)出 HTTP請求,本文章向大家介紹fetch()的用法,主要包括fetch()的用法使用實(shí)例、應(yīng)用技巧、基本知識點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價值,需要的朋友可以參考一下。
    2022-11-11
  • 淺析javascript 定時器

    淺析javascript 定時器

    這篇文章主要簡單介紹了javascript 定時器的相關(guān)知識,包括 setTimeout()以及clearInterval() 的定義和用法,非常實(shí)用,推薦給大家
    2014-12-12
  • javascript處理表單示例(javascript提交表單)

    javascript處理表單示例(javascript提交表單)

    這篇文章主要介紹了javascript處理表單示例,處理 各種表單, 以及鏈接,按鈕的通用組件,需要的朋友可以參考下
    2014-04-04
  • 薦書|您有一份JavaScript書單待簽收

    薦書|您有一份JavaScript書單待簽收

    &#8203;學(xué)習(xí)是一個持續(xù)不斷的過程,在互聯(lián)網(wǎng)技術(shù)里暢游的程序員們,對學(xué)習(xí)的渴望更是難以窮盡,下面這篇文章主要給大家分享了關(guān)于Javascript相關(guān)的書籍,對大家學(xué)習(xí)Javascript具有一定的參考學(xué)習(xí)價值,下面來一起看看吧。
    2017-07-07

最新評論

靖宇县| 水城县| 改则县| 公安县| 常宁市| 齐河县| 深泽县| 武定县| 兴城市| 思茅市| 齐齐哈尔市| 台中市| 惠水县| 延边| 公主岭市| 雷波县| 紫金县| 称多县| 曲水县| 沭阳县| 石台县| 西充县| 宜城市| 兰考县| 新安县| 五寨县| 开原市| 响水县| 上高县| 东阿县| 元江| 德惠市| 南投市| 信丰县| 万全县| 平阴县| 库伦旗| 天祝| 永康市| 东光县| 伽师县|