您的位置:首页 > 教育 > 培训 > 建筑方案设计_四川工程造价信息网_企业网站的优化建议_游戏推广合作

建筑方案设计_四川工程造价信息网_企业网站的优化建议_游戏推广合作

2024/12/26 14:07:49 来源:https://blog.csdn.net/qq_73270720/article/details/144721179  浏览:    关键词:建筑方案设计_四川工程造价信息网_企业网站的优化建议_游戏推广合作
建筑方案设计_四川工程造价信息网_企业网站的优化建议_游戏推广合作

迭代器

what

是一个对象,可以遍历某种数据结构这个对象要符合迭代器协议

迭代器协议

  1. 对象中有next方法,接收无参或者一个参数,
  2. 返回一个对象
    {value:当前产生的值, done:布尔值,表示是否当前所有值已经被迭代完毕}`
//封装成函数
function createIterator(arr){let i=0;return {next(){if(i < arr.length){return {value:arr[i++],done:false}}else{return {value:undefined,done:true}}}}}

可迭代对象

一个对象,实现了[Symbol.iterator方法]
符合可迭代协议,必须实现这个方法+返回迭代器对象

可迭代协议

  1. 遍历的目标对象
  2. 索引指针
  3. 迭代器

原生可迭代对象

String,Array,Map,Set等
要符合迭代协议
主要用于线性,可顺序遍历的的数据结构,例如 数组,字符串,set,map

可迭代对象应用

for of
展开语法
yield
解构赋值等
但是普通对象可以使用展开语法以及解构赋值, 因为es+新增的
如何实现对象的迭代

function mergeObj(...objs){let res={};for(const e of objs){for(const [key,value] of Object.entries(e)){res[key]=value}}return res}console.log(mergeObj(obj,obj2));console.log({...obj,...obj2});

自定义对象的可迭代性
class定义类,使得这个类创建的对象成为可迭代对象

class ClssRoom{constructor(address,name,stus){this.stus=stus,this.address= addressthis.name=name}push(newStu){this.stus.push(newStu)}[Symbol.iterator](){let i=0;return {next:()=>{if(i<this.stus.length){return {value:this.stus[i++],done:false}}else{return {value:undefined,done:true}}}}}}

生成器

生成器函数

  1. 一个函数,可以控制函数的执行
  2. 返回一个生成器对象

生成器
特殊的迭代器对象,除了next,还有return,throw方法

//1.生成器函数定义function* generatorFn(){console.log("start------");const value = 100;console.log("first------");//1.yield 可以接收值const a= yield //生成器暂停const value2 = 200;console.log("second------",a);//2.yield 可以返回值yield value2console.log("end-------");return 123}//2.生成器函数调用// generatorFn()//没反应const generator = generatorFn()console.log(generator.next(1));console.log(generator.next());console.log(generator.next());

yield 错位双向传递

  1. yiled 返回值
  2. yield 接收值 (next(val))

先返回内容,再传递内容

暂停状态,说明当前执行完毕,可以返回内容
恢复状态,说明开始执行,可以传入参数了

next

function* generatorFn(rv){console.log("生成器1:",rv);const rv1 = yield 1//每个rv都是上一次yield的返回值console.log("生成器2:",rv1);const rv2 = yield 2console.log("生成器3:",rv2);const rv3 = yield 3}const generator = generatorFn(0)generator.next() //第一次next调用无法传入内容console.log(generator.next(1));console.log(generator.next(2));console.log(generator.next(3));

return


unction* generatorFn(){yield 1yield 2yield 3}const generator = generatorFn()console.log(generator.next());//1console.log(generator.return(4));//4console.log(generator.next());//{value:undefined,done:true}

throw

  function* generatorFn(){try{yield 1yield 2yield 3}catch(err){console.log("捕获到异常:",err);}}const generator = generatorFn()console.log(generator.next());//1console.log(generator.next());//2console.log(generator.throw("出错了"));//捕获到异常: 出错了//未捕获异常function* generatorFn(){yield 1yield 2yield 3}const generator = generatorFn()console.log(generator.next());//1console.log(generator.next());//2console.log(generator.throw("出错了"));//控制台报错: 出错了

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com