1、什么是迭代器:

当一个对象可以当成迭代器时候;它要拥有以下定义:

满足上述定义就是一个迭代器:迭代器是一个对象!

function makeIterator(array){
    var nextIndex = 0;
    
    return {
       next: function(){
           return nextIndex < array.length ?
               {value: array[nextIndex++], done: false} :
               {done: true};
       }
    };
}

var it = makeIterator(['yo', 'ya']);

console.log(it.next().value); // 'yo'
console.log(it.next().value); // 'ya'
console.log(it.next().done);  // true

函数 makeIterator 返回的就是一个迭代器对象。

2、可迭代协议

当一个对象可以被 for of 遍历到,[...]展开符 展开;
它必须有一个[Symbol.iterator]方法(或者原型链上);该方法定义被迭代的行为,即返回什么类型的数据,
该方法放回的是一个对象,被返回的对象要符合迭代器协议。上面的 makeIterator 就可以作为一个对象的[Symbol.iterator]方法;因为它返回了一个对象,并且符合迭代器协议。(返回的就是迭代器对象)


翻译一下就是 一个对象是可迭代的(for of [...])他必须有一个[Symbol.iterator]方法返回一个迭代器。

function makeIterator(){
    var nextIndex = 0;
    var array= [1,2,4,5,6,7,8,9,10]
    return {
       next: function(){
           return nextIndex < array.length ?
               {value: array[nextIndex++], done: false} :
               {done: true};
       }
    };
}
var s = {a:1,b:2,c:3};//对象不是可迭代对象
s[Symbol.iterator]=makeIterator;//实现Symbol.iterator 方法
for (var x of s){
console.log(x)
}
//可以使用迭代for of 循环
1 debugger eval code:2:1
2 debugger eval code:2:1
4 debugger eval code:2:1
5 debugger eval code:2:1
6 debugger eval code:2:1
7 debugger eval code:2:1
8 debugger eval code:2:1
9 debugger eval code:2:1
10

3、默认的可迭代对象

字符串是可迭代对象
for ( var i of 'string'){
console.log(i)
}
s debugger eval code:2:1
t debugger eval code:2:1
r debugger eval code:2:1
i debugger eval code:2:1
n debugger eval code:2:1
g
var s = ('string')[Symbol.iterator]()
s  // String Iterator {  } //返回的s是迭代器对象
[...s]  //对象展开符 Array(6) [ "s", "t", "r", "i", "n", "g" ]
数组、map、 set 都是可迭代的对象
var ss = ([1,2,3,4,5])[Symbol.iterator]()
//undefined
ss
//Array Iterator {  }

4、生成器

显示的维护对象的状态不太方便(迭代器需要next方法,并且返回对象中要有value、done属性);生成器可以很好的做到这一点。
使用function* 的形式定义生成器函数;返回一个生成器对象。

function* generator(i) {
  yield i;
  yield i + 10;
}

var gen = generator(10);

console.log(gen.next().value);
// expected output: 10

console.log(gen.next().value);
// expected output: 20

使用yield 抛出结果;惰性求职;并且自动维护对象状态;不需要手动维护对象状态。

调用一个生成器函数并不会马上执行它里面的语句,而是返回一个这个生成器的 迭代器 (iterator )对象。 MDN

或者如果用的是 yield*(多了个星号),则表示将执行权移交给另一个生成器函数(当前生成器暂停执行) 移交代码控制权

next方法传参:

调用 next()方法时,如果传入了参数,那么这个参数会作为上一条执行的 yield 语句的返回值,例如:

function *gen(){
    yield 10;
    y=yield 'foo';
    yield y;
}

var gen_obj=gen();
console.log(gen_obj.next());// 执行 yield 10,返回 10
console.log(gen_obj.next());// 执行 yield 'foo',返回 'foo'
console.log(gen_obj.next(10));// 将 10 赋给上一条 yield 'foo' 的左值,即执行 y=10,返回 10
console.log(gen_obj.next());// 执行完毕,value 为 undefined,done 为 true
yield*
function* anotherGenerator(i) {
  yield i + 1;
  yield i + 2;
  yield i + 3;
}

function* generator(i){
  yield i;
  yield* anotherGenerator(i);// 移交执行权
  yield i + 10;
}

var gen = generator(10);

console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next().value); // 13
console.log(gen.next().value); // 20

参考链接 :https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols#iterable

标签智能推荐:

08-迭代生成器

一、迭代器和生成器迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方法:iter()&nbsp;和&nbsp;next()。在Python中,使用了yield的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代

迭代生成器阅读【Python3.8官网文档】

next__()'g'&gt;&gt;&gt;g.__next__()#迭代完了Traceback(mostrecentcalllast):File"&lt;stdin&gt;",line1,in&lt;module&gt;StopIteration当一个生成器函数被调用的时候,它返回一个迭代器,称为生成器迭代器。然后这个生成器迭代器来控制生成器函数的执行。当这个生成器迭代器的某一个方法被调用的时

《python-美藏篇》1.可迭代迭代生成器

首先区分可迭代对象(Iterable)、迭代器(Iterator)可迭代对象:包含__iter__方法的对象为可迭代对象,如List、Tuple、Dictionary迭代器:包含__iter__、__next__方法可迭代对象属于半成品--&gt;而迭代器属于直接食用产品,生成器属于特殊的迭代器,生成器函数执行后会返回生成器以上类型判断方法fromcollectionsimportIterator

Python-迭代

n。&nbsp;生成器举例:b=(xforxinrange(10))判断是否可以迭代可以使用isinstance()判断一个对象是否是可迭代对象fromcollectionsimportIterableisinstance('abc',Iterable)abc的位置就是要判断的对象二、迭代器可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。可以使用isinstance

Day04-迭代生成器

生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象。以下实例使用yield实现斐波那契数列:importsysdeffibonacci(n):#生成器函数-斐波那契a,b,

迭代生成器

#迭代器&nbsp;#可迭代协议------含有iter方法的都是可迭代的&nbsp;#迭代器协议:含有next和iter的都是迭代器&nbsp;#特点:&nbsp;&nbsp;&nbsp;#节省内存空间&nbsp;&nbsp;&nbsp;#方便逐个取值,一个迭代器只能取一次#生成器&nbsp;#生成器函数:&nbsp;&nbsp;&nbsp;#含有yield关键字的函数都是生成器函数&nbsp;

Python:生成器

的生成器:1.生成器函数:yield.yield语句一次返回一个结果,不会终止函数的运行。2.生成器表达式。一、生成器Generator:本质:迭代器(自带了__iter__和__next__方法)二、生成器函数--yield:一个包含yield关键字的函数就是生成器函数。yield可以为我们从函数中返回值,但是不同于return,return执行后程序会终止。调用生成器函数不会得到返回的具体的值

流畅的python——14 可迭代的对象、迭代生成器

方面迭代器协议:实现了两个方法:__next__和__iter__生成器实现了这两个方法,所以,所有生成器都是迭代器。abc.Iterator类型2实现方式方面生成器:含有yield参数或生成器表达式。types.GeneratorType类型调用生成器函数或者执行生成器表达式得到的生成器对象属于语言内部的GeneratorType类型该类型实现了迭代器协议。定义:生成器——迭代器对象的类型,调用

Python 迭代生成器、可迭代对象

个迭代器对象obj25#也可以直接写成returnLi()2627obj=Foo()#创建可迭代对象obj(有__iter__方法,无__next__方法)28print(dir(obj))29foriinobj:30print(i)31#循环可迭代对象的时候,内部先执行obj.__iter__并且获取迭代器对象32#然后不断循环迭代器对象的__next__方法3334#判断是可迭代对象还是迭代器

迭代

#1.迭代器##*******************************#首先,明确概念,迭代就是循环##可迭代对象包含1.迭代器,2.序列,3.字典。而生成器是一种特殊的迭代器。#*******************************##什么是迭代器?????##迭代器是访问可迭代对象的工具。这个工具也是一个对象##迭代器怎么来????##1.将可迭代对象用iter()方法返回得到