拆開(kāi)JavaScript迭代器模式內(nèi)部黑盒子
一、內(nèi)部迭代器
迭代器模式,指的是提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象或者數(shù)組中的各種元素,而又不暴露該對(duì)象的內(nèi)部表示。
內(nèi)部迭代器是自動(dòng)的,將回調(diào)函數(shù)傳入迭代器進(jìn)行執(zhí)行,訪問(wèn)到每一個(gè)元素都會(huì)執(zhí)行傳入迭代器中的回調(diào)函數(shù)。
模擬內(nèi)部迭代器如下:
// 定義數(shù)組原型上的mapFn內(nèi)部迭代器 Array.prototype.mapFn = function (callback) { let arr = this; let newArr = [] for (let i = 0; i < arr.length; i++) { newArr[i] = callback(arr[i], i, arr) } return newArr } // 定義原始數(shù)組 var arr = [1, 2, 3, 4, 5]; // 定義回調(diào)函數(shù) var callback = val => val * 2; // 執(zhí)行數(shù)組的mapFn方法調(diào)用回調(diào)函數(shù)callback var newArr = arr.mapFn(callback); // 打印返回值 console.log(newArr)
callback
函數(shù)可以傳入三個(gè)參數(shù),第一個(gè)參數(shù)表示當(dāng)前的值,第二個(gè)參數(shù)表示當(dāng)前索引,第三個(gè)參數(shù)表示正在操作的數(shù)組。返回值為新數(shù)組。
當(dāng)前例子中,callback
指的是val => val * 2
,通過(guò)數(shù)組的mapFn
方法執(zhí)行callback
函數(shù),返回值為新的數(shù)組newArr
。
在實(shí)際的使用中,Array.prototype.mapFn
的內(nèi)部實(shí)現(xiàn)是看不到的,就像我們看不到數(shù)組的操作map
和forEach
一樣,這里如果將Array.prototype.mapFn
作為黑盒子。就有如下的流程:
二、外部迭代器
外部迭代器是非自動(dòng)的,提供了next
方法,需要手動(dòng)的去執(zhí)行next()
以進(jìn)行下一個(gè)元素的訪問(wèn)。
// 定義迭代器生成函數(shù) function makeIterator(array) { var nextIndex = 0; return { next: function () { return nextIndex < array.length ? { value: array[nextIndex++], done: false } : { value: undefined, done: true }; } }; } // 產(chǎn)生迭代器 var it = makeIterator(['a', 'b']); // 通過(guò)迭代器暴露出來(lái)的next方法,外部調(diào)用迭代器 console.log(it.next()) // { "value": "a", "done": false } console.log(it.next()) // { "value": "b", "done": false } console.log(it.next()) // { "value": undefined, "done": true }
makeIterator
返回next
方法,每一次執(zhí)行都會(huì)執(zhí)行下一個(gè)迭代。done
是否迭代結(jié)束,value
是當(dāng)前迭代獲取到的值。如果done
為true
,對(duì)應(yīng)的value
就是undefined
。
在實(shí)際的使用中,makeIterator
的內(nèi)部實(shí)現(xiàn)是看不到的,這里如果將makeIterator
作為黑盒子。就有如下的流程:
總結(jié):
目前JavaScript
已經(jīng)內(nèi)置了多種內(nèi)部迭代器,比如forEach
、map
、filter
和reduce
等,內(nèi)部執(zhí)行回調(diào)函數(shù)function(value, index, currentArr){ xxxx }
對(duì)每個(gè)訪問(wèn)到的元素進(jìn)行處理。通過(guò)generate
和yield
配合使用也可以產(chǎn)生外部迭代器,通過(guò)next()
方法進(jìn)行下一步的執(zhí)行。
以上就是拆開(kāi)JavaScript迭代器模式內(nèi)部黑盒子的詳細(xì)內(nèi)容,更多關(guān)于JavaScript迭代器模式內(nèi)部黑盒子的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript實(shí)現(xiàn)非常簡(jiǎn)單實(shí)用的下拉菜單效果
這篇文章主要介紹了JavaScript實(shí)現(xiàn)非常簡(jiǎn)單實(shí)用的下拉菜單效果,通過(guò)定義顯示及隱藏菜單項(xiàng)及鼠標(biāo)事件調(diào)用該函數(shù)實(shí)現(xiàn)下拉菜單功能,需要的朋友可以參考下2015-08-08基于JavaScript實(shí)現(xiàn)樹(shù)形下拉框
這篇文章主要為大家詳細(xì)介紹了基于JavaScript實(shí)現(xiàn)樹(shù)形下拉框的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08JavaScript+Canvas實(shí)現(xiàn)繪制音頻可視化波形圖
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript和Canvas實(shí)現(xiàn)繪制音頻可視化波形圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02基于Web標(biāo)準(zhǔn)的UI組件 — 樹(shù)狀菜單(2)
基于Web標(biāo)準(zhǔn)的UI組件 — 樹(shù)狀菜單(2)...2006-09-09JavaScript字符串處理之trim()和replace()詳解
這篇文章主要給大家介紹了關(guān)于JavaScript字符串處理之trim()和replace()的相關(guān)資料,文中介紹的所有這些方法都不會(huì)修改原始字符串,而是返回一個(gè)新的字符串,需要的朋友可以參考下2024-10-10控制頁(yè)面按鈕在后臺(tái)執(zhí)行期間不重復(fù)提交的JS方法
下面的代碼可以避免這種情況的發(fā)生,要等第一次執(zhí)行完返回?cái)?shù)據(jù)到前臺(tái)后才能提交第二次。2013-06-06Canvas實(shí)現(xiàn)二娃翠花回家之路小游戲demo解析
這篇文章主要為大家介紹了Canvas實(shí)現(xiàn)二娃翠花回家之路小游戲demo解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04js-FCC算法-No repeats please字符串的全排列(詳解)
下面小編就為大家?guī)?lái)一篇js-FCC算法-No repeats please字符串的全排列(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05