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

深入理解JS迭代协议——手写迭代器

时间:2023-04-02 18:18:18 HTML

iterable协议和迭代器协议参考MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocolsiterable协议可以迭代协议允许JavaScript对象定义或自定义它们的迭代行为,例如(定义)在for..of结构中可以循环(获取)哪些值。一些内置类型是内置可迭代类型并具有默认迭代行为,例如Array或Map,而某些类型则不是(例如Object)。为了可迭代,对象必须实现@@iterator方法,这意味着对象(或其原型链上的对象)必须具有名为Symbol.iterator的属性。当一个对象需要被迭代时(比如在for..of循环中使用),它的@@iterator方法被无参调用,然后返回一个迭代器,用于在迭代时获取值。迭代器协议迭代器协议定义了一种生成有限或无限值序列的标准方法,当所有值都被迭代过时,它具有默认返回值。只有满足以下条件的对象才被认为是迭代器:它实现了一个next()方法并具有以下含义返回一个对象的无参数函数,返回的对象有两个属性:done(boolean)true:迭代器已超过可迭代计数。这种情况下,value的值可以省略;如果迭代器可以产生序列中的下一个值,则为false。这相当于不指定done属性。value-迭代器返回的任何JavaScript值。done为真时可以省略。next方法必须返回一个对象,它有两个必要的属性:done和value。如果返回一个非对象值(例如false和undefined),一个TypeError("iterator.next()returnedanon-objectvalue")错误varmyIterator={next:function(){//...},[Symbol.iterator]:function(){returnthis}}可迭代对象(Iterable)满足可迭代协议的对象就是可迭代对象。可迭代协议:对象的[Symbol.iterator]值是一个无参函数,返回一个迭代器(Iterator)。具有Iterator接口的本机数据结构如下所示。ArrayMapSetStringTypedArray函数NodeList对象的arguments对象//for...of会得到可迭代对象的[Symbol.iterator](),并在迭代器上一一调用next()//直到迭代器返回done对象的属性为true,遍历结束for(letvalueof["a","b","c"]){console.log(value);}手写一个迭代器(Iterator)/*这是一个手写迭代器(Iterator),一个符合迭代器协议的对象。Iterator协议:对象的next方法是一个没有参数的函数,它返回一个有两个属性的对象:done和value:*/varit=makeIterator(["a","b"]);它.next();//{value:"a",done:false}it.next();//{value:"b",done:false}it.next();//{value:undefined,done:true}functionmakeIterator(array){varnextIndex=0;return{next:function(){returnnextIndex