迭代器模式
ES6 引入的迭代器模式,Iterable
接口定义了对象是否可迭代,Iterator
接口定义了对象如何迭代。
可迭代协议
任何实现了 [Symbol.iterator]()
方法的对象都被认为是可迭代的,这个方法必须返回一个 Iterator
对象。
ES 内置的可迭代对象有:数组、Map、Set、字符串、arguments 对象、NodeList 对象。
ts
// 没有实现迭代器工厂函数
const obj: any = {};
console.log(obj[Symbol.iterator]); // undefined
const num: any = 123;
console.log(num[Symbol.iterator]); // undefined
// 实现了迭代器工厂函数
const arr = [1, 2, 3];
console.log(arr[Symbol.iterator]); // [Function: values]
console.log(arr[Symbol.iterator]()); // Object [Array Iterator] {}
console.log(arr[Symbol.iterator]().next()); // { value: 1, done: false }
可迭代对象可以使用 for...of
循环,...
扩展运算符,解构赋值进行迭代。
ts
const str = "hello";
// for...of
for (const char of str) {
console.log(char);
}
// 扩展运算符
console.log(...str); // h e l l o
// 解构赋值
const [first, second, ...rest] = str;
console.log(first, second, rest); // h e [ 'l', 'l', 'o' ]
迭代器协议
Iterator
接口定义了一个 next()
方法,该方法返回一个包含 done
和 value
属性的对象,done
是一个布尔值,指示是否还有更多值可以迭代,value
包含当前的值。
当 done = true
时,value = undefined
时,表示迭代结束。
ts
const map = new Map();
map.set("name", "John");
map.set("age", 30);
const mapIterator = map[Symbol.iterator]();
console.log(mapIterator.next()); // { value: [ 'name', 'John' ], done: false }
console.log(mapIterator.next()); // { value: [ 'age', 30 ], done: false }
console.log(mapIterator.next()); // { value: undefined, done: true }
console.log(mapIterator.next()); // { value: undefined, done: true }