Iterator
迭代器是一种一次使用的对象,里面有一个next( )方法,获取容器(可迭代对象)中的数据,同时指向下一个数据。
可迭代对象
- string
- array
- map
- set
- arguments对象
- NodeList等DOM集合类型
:::info
部署[Symbol.iterator]属性的对象,都具有可迭代的能力。这是一个工厂函数,可以识别可迭代的数据类型,并返回一个迭代器对象。
:::
普通对象没有[Symbol.iterator]()接口,因为对象属性并没有顺序,遍历顺序是不确定的。
注释说明
:::info 当你拿到一个容器的迭代器(泛化指针),迭代器指向容器的开始位置,然后获取数据传给算法,同时迭代器会自动指向下一个数据。这里的算法应该具有循环结构,就可以不断的执行迭代器,获取数据。 :::
[Symbol.iterator]
接口工厂函数,返回值是有next方法的对象。
//重写迭代器接口函数1
const arr1 = [1, 2, 3];
arr[Symbol.iterator] = function () {
let idx = 0;
let len = this.length;
let that = this;
return { //迭代器工厂函数的返回值必须符合迭代器协议,也就是返回值是对象,且必须有next方法。
next(){
if(idx < len){
idx++;
return {value: that[idx - 1], done: false}
}else{
return {value: undefined, done: true}
}
}
}
}
//重写迭代器接口函数2
const arr2 = [1, 2, 3];
arr2[Symbol.iterator] = function () {
return [2, 3, 4, 5, 6][Symbol.iterator]();
}
//重写迭代器接口函数3,使用生成器函数。
//生成器函数的返回值是符合迭代器协议。
const arr3 = [1, 2, 3];
arr3[Symbol.iterator] = function* generatorFn() {
yield 1;
yield 2;
yield 3;
}