迭代器

101 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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:每次迭代得到的数据
}

展开运算符与可迭代对象

展开运算符可以作用于可迭代对象,这样,就可以轻松的将可迭代对象转换为数组。