定义:有迭代行为的对象。为了实现可迭代,一个对象必须实现 @@iterator 方法,这意味着这个对象(或其原型链中的任意一个对象)必须具有一个带 Symbol.iterator 键(key)的属性。
内置可迭代对象:Map, set, string, array, TypedArray...
// 自定义可迭代对象
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]
迭代器定义:迭代器是通过使用 next() 方法实现 Iterator protocol 的任何一个对象。在每次迭代中,next() 方法能返回一个无参函数<()=>{ done, value }>
function makeRangeIterator(start = 0, end = Infinity, step = 1) {
let nextIndex = start;
let iterationCount = 0;
const rangeIterator = {
next: function() {
let result;
if (nextIndex < end) {
result = { value: nextIndex, done: false }
nextIndex += step;
iterationCount++;
return result;
}
return { value: iterationCount, done: true }
}
};
return rangeIterator;
}
生成器产生背景:使用迭代器,需要显式地维护其内部状态(done, value, next()),因此需要谨慎地创建。
生成器定义:一个包含自有迭代算法的函数, 同时它可以自动维护自己的状态。
语法:*function() => { yeild result } / asycn function() => { await result }
function* makeRangeIterator(start = 0, end = Infinity, step = 1) {
for (let i = start; i < end; i += step) {
yield i;
}
}
var a = makeRangeIterator(1,10,2)
a.next() // {value: 1, done: false}
a.next() // {value: 3, done: false}
a.next() // {value: 5, done: false}
a.next() // {value: 7, done: false}
a.next() // {value: 9, done: false}
a.next() // {value: undefined, done: true}
参考文献