当前位置: 首页 > Web前端 > HTML

JavaScript高级编程笔记07迭代器与生成器

时间:2023-03-28 10:34:13 HTML

1.Iteration多次重复执行一个程序,(有明确的终止条件)iterators,generatorsES6countingloop(for):最简单的迭代次数迭代,Iterate每次执行的操作(顺序已知)古代迭代(有序->数组):①必须是数组,需要引用数组本身;②自增索引方法通用迭代(ES5):forEach优点:不需要引用数组本身;不需要索引缺点:只能用于数组的直接调用,不能手动终止Iterator属性,key是Symbol.iterator,value是迭代器工厂函数(创建Iterator对象的能力)。迭代器工厂函数返回[一个实现了Iterator接口的对象],其中包含key为next的属性,也可能包含key为return的属性自动调用默认的迭代器工厂函数生成迭代器操作:for-of,数组解构,传播运算符Array.from(...),newSet(...),newMap(...)Promise。all(...),Promise.race(...)yield*...迭代器维护对可迭代对象的引用,防止垃圾回收。每个内置的可迭代对象的默认迭代器函数生成的迭代器也有自己的默认迭代器函数,返回给自己(没有严格实现Iterable接口,默认迭代器函数不能创建新的迭代器)classCounter{构造函数(限制){这个。限制=限制;}[象征。迭代器](){让计数=1,o=this;return{next(){if(count<=o.limit){return{done:false,value:count++};}else{return{done:true};}},return(){console.log('提前退出');返回{完成:真};}}}}letcounter1=newCounter(5);for(letiofcounter1){if(i>2){break;}console.log(i);}//1//2//退出earlyletcounter3=newCounter(5);let[a,b]=counter3;console.log(a);console.log(b);//提前退出//1//2console.log("//=======arrayiteratorcannotbeclosed");leta1=[1,2,3,4,5];letiter=a1[Symbol.iterator]();for(letiofiter){console.log(i);如果(我>2){打破;}}for(letiofiter){console.log(i);}//1//2//3//4//53.生成器的生成器函数以*为前缀(不能接受箭头函数)-->generatorfunction/*Functiongenerator(){constructor(){this={next(){//...}}返回这个;}[Symbol.iterator](){返回这个;}}*/letg=generator();g===g[Symbol.iterator]使用场景(yield):生成器对象作为一个可迭代对象(以默认的[Symbol.iterator]为key属性,没有工厂函数创建新的iterator).yield实现了input和output给next方法传递参数,参数会被当作上一个yield操作的结果值产生一个可迭代对象yield*可迭代对象yield*操作的结果值是的值Iterable对象遍历到done时的value属性为true实现递归yield*(function*+yield*)可以将递归结果包装成generator对象(实现Iterator接口)其他:生成器函数可以生成为默认的iterator(factoryfunction)->generator对象(实现了Iterator接口)generator对象有一个APIthrow()generator函数,用于内部处理,可以Continue-->跳过当前yield操作(进入下一个yield);如果不处理,迭代终止function*generatorFn(){return'foo';}letgeneratorObject=generatorFn();console.log(generatorObject);console.log(generatorObject.next());//对象[Generator]{}generatorFn{}//{value:'foo',done:true}{value:"foo",done:true}function*generatorFn2(){console.log('foobar');}generatorObject=generatorFn2();generatorObject.next();//foobargeneratorObject.next();function*generatorFn3(){yield'foo';产量“酒吧”;return'baz';}letg3=generatorFn3();console.log(g3.next());console.log(g3.next());console.log(g3.next());//{值:'foo',done:false}//{value:'bar',done:false}//{value:'baz',done:true}g3=generatorFn3();for(constxofg3){console.log(x);}//foo//barg3=generatorFn2();for(constxofg3){console.log(x);}//foobarclassNode{constructor(id){this.id=id;this.neighbors=newSet();}连接(节点){如果(节点!==this){this.neighbors.add(节点);node.neighbors.add(这个);}}}classRandomGraph{constructor(size){this.nodes=newSet();for(leti=0;in.id).join(',');console.log(`${node.id}:${ids}`);}}//整张图是否连接isConnected(){constvisitedNodes=newSet();function*traverse(nodes){for(constnodeofnodes){if(!visitedNodes.has(node)){yieldnode;产量*遍历(node.neighbors);}}}//获取集合中的第一个节点constfirstNode=this.nodes[Symbol.iterator]().next().value;//使用递归生成器代替每个节点for(constnodeoftraverse([firstNode])){visitedNodes.add(node);}//functiontraverse(nodes){//for(constnodeofnodes){//if(!visitedNodes.has(node)){//visitedNodes.add(node);//遍历(node.neighbors);//}//}//}返回visitedNodes.size===this.nodes.size;}}constg=newRandomGraph(6);g.print();//0:1,2//1:0,5//2:0//3://4:5//5:1,4console.log(g.isConnected());console.log('实际输入输出1===========')function*generatorFn(initial){//console.log(initial);console.log(yield1);console.log(yield2);返回产量3;}letgenObj=generatorFn('foo');console.log(genObj.next('bar'));console.log(genObj.next('baz'));console.log(genObj.next('qux'));console.log(genObj.next());//{value:1,done:false}//baz//{value:2,done:false}//qux//{value:3,done:false}//{value:undefined,done:true}console.log('实际输入输出2===========')function*generatorFn2(){returnyield'foo';}letgenObj2=generatorFn2();console.log(genObj2.next());console.log(genObj2.next('bar'));console.log(genObj2.next('test'));//{value:'foo',done:false}//{value:'bar',done:true}//相对于给done的时间的价值?//{value:undefined,done:true}for(constxofgeneratorFn2()){console.log(x);}//foofunction*zeroes(n){while(n--){yield0;}}console.log(Array.from(zeroes(8)));function*innerGeneratorFn(){yield'foo';return'bar';}function*outerGeneratorFn(){console.log('itervalue:',yield*innerGeneratorFn());}for(constxofouterGeneratorFn()){console.log('value:',x);}//value:foo//itervalue:barfor(constxofinnerGeneratorFn()){console.log(x);}//fooclassFoo{constructor(){this.values=[1,2,3];}*[符号.iterator](){yield*this.values;}//[Symbol.iterator](){//让i=0,len=this.values.length,o=this;//return{//next(){//return{//value:o.values[i++],//done:i>len//}//}//}//}}constf=newFoo();for(constxoff){console.log(x);}//1//2//3