一猜揪、迭代器的定義:
迭代器是一種特殊對象,它具有一些專門為迭代過程設(shè)計的專有接口坛梁,所有的迭代器對象都有一個next()方法而姐,每次調(diào)用都返回一個結(jié)果對象。結(jié)果對象有兩個屬性:一個是value罚勾,表示下一個將要返回的值毅人;另一個是done,它是一個布爾類型的值尖殃,當沒有更多可返回數(shù)據(jù)時返回true丈莺。迭代器還會保存一個內(nèi)部指針,用來指向當前集合中值的位置送丰,每調(diào)用一次next()方法缔俄,都會返回下一個可用的值
如果在最后一個值返回后再調(diào)用next()方法,那么返回的對象中屬性done的值為true器躏,屬性value則包含迭代器最終返回的值俐载,這個返回值不是數(shù)據(jù)集的一部分,它與函數(shù)的返回值類似登失,是函數(shù)調(diào)用過程中最后一次給調(diào)用者傳遞信息的方法遏佣,如果沒有相關(guān)數(shù)據(jù)則返回undefined
二、為何會出現(xiàn)迭代器揽浙?
背景前提:
我相信你一定用過for循環(huán)状婶,并且也有過空指針引用的問題:比如數(shù)組長度只有5,但是你的索引卻跑到了6馅巷。邏輯稍微失誤膛虫,就導(dǎo)致程序不能正常運行。
迭代器想要解決的問題是:
解決钓猬、或減少使用類似for循環(huán)過程中稍刀,訪問變量集合的中出錯的問題。比如:空指針引用敞曹。
舉個栗子:
我們使用for循環(huán)遍歷集合時账月,容易出錯综膀,但是我們使用類似forEach的話,就會減少空指針引用的問題捶障。
array.forEach(element => {
// 此時可以不用i來操作集合了僧须。
});
三、用js實現(xiàn)一個簡單的迭代器
function myIterator(list) {
let i = 0;
return {
next: function() {
let done = (i >= list.length);
let value = !done ? list[i++] : undefined;
return {
done: done,
value: value
};
}
};
}
由函數(shù)定義可以看出:
- 函數(shù)返回值是個對象 项炼,對象中担平,key為next、value為函數(shù)锭部;
- 每調(diào)用一次next()暂论,i+1,同時返回一個對象 拌禾,對象就是集合的元素取胎;
四、寫在最后
共同進步湃窍、共同學(xué)習(xí)闻蛀、每天進步一點點;
V*公眾號:軟件編程網(wǎng)站開發(fā)