聊一聊迭代器

93 阅读1分钟

1、什么适合迭代器

迭代器是一个对象,它定义一个序列,并在终止时可能返回一个返回值。

2、内置的可迭代对象

Array Arguments Set Map String NodeList 等

3、迭代器的工作原理

迭代器是一种用于遍历数据集合的对象,它提供了一种统一的方式来访问集合中的元素,而无需暴露集合的内部实现细节。迭代器通常具有两个主要方法:__iter__() 和 __next__()

1、一旦创建,迭代器对象可以通过重复调用 next()显式地迭代。
2、 迭代一个迭代器被称为消耗了这个迭代器,因为它通常只能执行一次。
3、在产生终止值之后, 对 next()的额外调用应该继续返回{done:true}

let xiyou = ['q', 'w', 'e', 'r']
for (let i in xiyou) console.log(i)//0,1,2
for (let i of xiyou) console.log(i)//q,w,e,r

let iteator = xiyou[Symbol.iterator]()
console.log(iteator.next()) // q
console.log(iteator.next()) // w
console.log(iteator.next()) // e
console.log(iteator.next()) // r

4、迭代器的应用

const banji = {
    name: '终极一班',
    stus: [
        'x',
        'w',
        'c',
        'g'
    ]
}
for (let v of banji) {
    console.log(v) // banji is not iterable
}

目的:输出数组的内容x,w,c,g。通过输出结果可知banji这个对象是不可迭代,此时就需要通过在banji这个对象中添加Symbol iterator来自定义可迭代性。如下代码 :

const banji = {
    name: '终极一班',
    stus: [
        'x',
        'w',
        'c',
        'g'
    ],
    [Symbol.iterator]() {  //完成自定义迭代器
        let index = 0
        let _this = this
        return {
            next: function () {
                if (index < _this.stus.length) {
                    const result = {
                        value: _this.stus[index], done: false
                    }
                    index++
                    return result
                } else {
                    return {
                        value: undefined, done: true
                    }
                }
            }
        }
    }

}
for (let i of banji) {
    console.log(i)  //x,w,x,g
}

4、自定义的可迭代对象

var myIterable = {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  },
};

for (let value of myIterable) {
  console.log(value);
}
// 1
// 2
// 3

// 或者

[...myIterable]; // [1, 2, 3]