持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
迭代
从一个数据集合中按照一定的顺序,不断的取出数据的过程
迭代器强调的是依次取出数据,并不保证取出多少,也不保证把所有的数据取完。而遍历前调的是要把整个数据依次全部取出。
迭代器
迭代器是对迭代过程的封装,由于拿数据的动作交给迭代器完成,就不需要知道具体有那些数据。 迭代器在不同的语言里各不相同。 迭代器需要具备的能力:
- 具有得到下一个数据的能力
- 判断是否还有后续数据的能力
在JS中规定:如果一个对象具有next方法并且该方法返回一个对象,该对象的格式如下:
{
value: 值,
done: 是否迭代完成
}
含义:
- next方法:用于得到下一个数据
- 返回的对象:
- value:下一个数据的值
- done:boolean,是否迭代完成
const obj = {
next(){
return {
value: 'a',
dome: false
}
}
}
具备以上特征,我们就认为它是一个迭代器。
利用迭代器实现数组的读取:
const arr = [1,2,3,4];
const iterator = {
i: 0,
next(){
return {
value: arr[this.i++],
done: this.i >= arr.length
}
}
}
let data = iterator.next();
while(!data.done){
console.log(data.value);
data = iterator.next();
}
console.log("迭代完成")
跟我们之前的循环相比好处在于之后只需要跟 iterator 对象打交道,我们关注的是取数据的过程而不是数据本身。亮点就是可以按需获取数据。
迭代器创建函数
迭代器创建函数顾名思义就是创建一个迭代器对象的函数。
function createIterator(arr){
let i = 0;
return {
next(){
return {
value: arr[i++],
done: i >= arr.length
}
}
}
}
const iter1 = createIterator(arr);
const iter2 = createIterator(arr);
可迭代协议
ES6规定,如果一个对象具有知名符号属性Symbol.iterator,并且属性值是一个迭代器创建函数,则该对象是可迭代的(iterable)
for-of 循环
for-of 循环用于遍历可迭代对象,格式如下
//迭代完成后循环结束
for(const item of iterable){
//iterable:可迭代对象
//item:每次迭代得到的数据
}
展开运算符与可迭代对象
展开运算符可以作用于可迭代对象,这样,就可以轻松的将可迭代对象转换为数组。