Iterator(遍历器)
为不同的数据结构提供统一的访问机制的接口(本质是一个指针对象
)
三大作用:
- 为各种数据结构提供统一简便的访问接口
- 使数组成员按某种次序排列
- 主要供for…of消费
默认的Iterator接口
使用for…of循环遍历某种数据结构时,该循环会自动寻找Iterator接口
原生具有Iterator接口的数据结构:
- Array
- Map
- Set
- String
- TypedArray
- 函数的arguments对象
- NodeList对象
遍历器对象的next方法,在返回一个值的同时自动将内部指针移到下一个实例
调用Iterator接口的场合
- 解构赋值
对数组和Set结构进行解构赋值时,会默认调用Symbol.iterator方法 - 扩展运算符
…也会调用默认的Iteraotr接口 - yield*
let generator = function* () {
yield 1;
yield* [2,3,4];
yield 5;
};
var iterator = generator();
iterator.next() // { value: 1, done: false }
iterator.next() // { value: 2, done: false }
iterator.next() // { value: 3, done: false }
iterator.next() // { value: 4, done: false }
iterator.next() // { value: 5, done: false }
iterator.next() // { value: undefined, done: true }
- 其他场合
- for…of
- Array.from()
- Map()、 Set()、 WeakMap()、 WeakSet()
- Promise.all()
- Promise.race()
字符串的Iterator接口
next方法可以覆盖原生的Symbol.iterator方法达到修改遍历器行为的目的
// 只有调用遍历器接口才会触发
console.log([...str]);
console.log(...str);
str[Symbol.iterator] = function() {
return {
next: function() {
if (this._first) {
this._first = false;
return { value: "bye", done: false };
} else {
return { done: true };
}
},
_first: true
};
};
console.log([...str]); // ["bye"]
console.log(str); // "hi"
Iterator接口与Generator函数
**let obj = {
* [Symbol.iterator]() {
yield 'hello';
yield 'world';
}
};
for (let x of obj) {
console.log(x);
}
// "hello"
// "world"**
遍历器对象的return()、throw()
遍历器对象除了next方法,还有可选的return和throw方法
for…of循环
普通的对象不能直接使用for…of结构,可以使用for…in循环
部署了Iterator接口可以使用