- 迭代模式:
提供一种方法可以顺序获得聚合对象中的各个元素,是一种最简单也是最常见的设计模式,它可以让用户透过特定的接口巡防集合中的每一个元素而不用了解底层的实现。
- 迭代器简介:
依照与迭代模式的思想而实现,分为内部迭代器和外部迭代器。
- 内部迭代器:
本身就是函数,该函数内部定义好迭代规则,完全接手整个迭代过程。外部只需要一次初始调用。
Array.prototype.forEach、jQuery.each
内部迭代器
- 外部迭代器
本身是函数,执行返回迭代对象,迭代下一个元素必须显示调用,调用复杂度增加,但灵活性增强。
function outerlterator(){}
外部迭代器
写个最简单的例子
// 内部迭代器
let arr = [1,2,3];
arr.forEach((ele)=>{
console.log(ele);
})
// 外部迭代器
function outerlterator(o){
let curIndex = 0;
let next = ()=>{
return {
value: o[curIndex],
done: 0.length == ++curIndex;
}
}
return{
next
}
}
let data = outerlterator(arr);
data.next
迭代器目的:
从迭代模式思想中可以看出,就是要标准化迭代操作。
如果遇到有修改数据格式的场景,数组变成对象,导致遍历代码大量重写
ES6 引入Iterator,部署在NodeList、arguments、Array、Set、Map、字符串上等数据的 Symbol.iterator
属性。
使得这些数据是iterrable可迭代的,能进行for of、……、Array。from等操作
let obj = {
0: 'a',
1: 'b',
2: 'c'
length:3,
}
conosle.log([...obj]);// 报错
let obj = {
0: 'a',
1: 'b',
2: 'c'
length:3,
[Symbol.iterator]: function(){
let curIndex = 0;
let next = ()=>{
return {
value: this[curIndex],
done: this.length == ++curIndex;
}
}
return{
next
}
}
}
conosle.log([...obj]);// 正常迭代
for(let p of obj){
console.log(p)
}
// a b c 也是正常迭代
