迭代器(Iterator)和生成器(Generator)
迭代器是一种特殊对象,可以对可迭代对象(如Array,Object)进行遍历取值
可迭代对象具有Symbol.iterator属性 可以通过Symbol.iterator创建迭代器
let arr=[1,2,3]
const iter=arr[Symbol.iterator]()
console.log(iter.next()) //{value:1,done:false}
和for循环不同的是,for循环是通过索引值取值,迭代器是利用next()取值,一次只可以取到下一项,并且返回结果是一个对象,包含取到的值和是否结束 如{value:1,done:false}
value表示取到的值,done表示该项是否为结束项,如果数组已经遍历完,则结果为{value:undefined,done:true}
function createIterator(items) {
vari = 0;
return {
next: function() {
vardone = (i >= items.length);
varvalue = !done ? items[i++] : undefined;
return {
done: done,
value: value
};
}
};
}
var iterator = createIterator([1, 2, 3]);
console.log(iterator.next()); // "{ value: 1, done: false }"
console.log(iterator.next());// "{ value: 2, done: false }"
console.log(iterator.next());// "{ value: 3, done: false }"
console.log(iterator.next());// "{ value: undefined, done: true }"
生成器是返回迭代器的函数
语法与普通函数类似但是要在function关键字后加一个*
function* createIterator(){
yield 1;
yield 2;
yield 3;
}
let iterator=createIterator()
console.log(iterator.next()) // {value:1,done:false}
console.log(iterator.next().value) // 2
每当执行完yield语句函数就会停止执行
yield关键字只能在生成器函数内部使用,否则会报错,以下情况也会报错
function* create(){
function fn(){
yield 1;
}
}
生成器常用情况是状态机
function* createIterator(){
while(1){
yield:'A',
yield:'B',
yield:'C'
}
}
let Iterator = createIterator()
console.log(Iterator.next().value) //'A'
console.log(Iterator.next().value) //'B'
console.log(Iterator.next().value) //'C'
console.log(Iterator.next().value) //'A'
console.log(Iterator.next().value) //'B'