Iterator
迭代器是一种一次使用的对象,里面有一个next( )方法,获取容器(可迭代对象)中的数据,同时指向下一个数据。
可迭代对象
- string
- array
- map
- set
- arguments对象
- NodeList等DOM集合类型
:::info
部署[Symbol.iterator]属性的对象,都具有可迭代的能力。这是一个工厂函数,可以识别可迭代的数据类型,并返回一个迭代器对象。
:::
普通对象没有[Symbol.iterator]()接口,因为对象属性并没有顺序,遍历顺序是不确定的。
注释说明
:::info
当你拿到一个容器的迭代器(泛化指针),迭代器指向容器的开始位置,然后获取数据传给算法,同时迭代器会自动指向下一个数据。这里的算法应该具有循环结构,就可以不断的执行迭代器,获取数据。
:::
[Symbol.iterator]
接口工厂函数,返回值是有next方法的对象。
//重写迭代器接口函数1const 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}}}}}//重写迭代器接口函数2const 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;}
