美文网首页
迭代器,生成器和yield

迭代器,生成器和yield

作者: 逍天辰 | 来源:发表于2015-08-27 15:06 被阅读0次

    迭代器, 生成器, yield 都是ES6 中的新语法

    迭代器

    迭代器由三个方法组成:

    1. hasNext() 是否还有下一个元素
    2. next() 迭代到下一个元素
    3. reset() 重置,一般用来抛出异常
      下面是一个简单的迭代器的例子:
      function Range(min,max){//[min,max)
      return {
      cur:min,
      hasNext:function(){
      return this.cur<max;
      },
      next:function(){
      return this.cur++;
      },
      reset:function(){
      throw new Error('unsupportted operation');
      }
      }
      }
      for(var iter = Range(1,10);iter.hasNext();){
      i = iter.next();
      console.log(i);
      }

    可以看到, 每次在使用Range 函数的时候, 都要调用 .hasNext() 方法来判断一下是否还有下一个元素,之后再执行 .next() 函数。

    生成器和yield

    普通的函数以 function 来定义, 而生成器函数则是由 function* 来定义。可以说 生成器是一种更好的实现迭代器的方式。

    yield 的作用: yield可以看出是“暂停”了函数的执行, 然后在调用函数的.next() 方法之后, 函数开始执行直到下一个 yield的表达式。
    上边的生成器代码可以改变为:

    function* Range(start, end) {
        for(var i = start; i<end;i ++) {
           yield i;    (2)
        }
    }
    

    var range = Range(1,10); // (1)
    while(true) {
    var ran = range.next(); // (3)
    if(ran.done) break;
    console.log(ran);
    }
    输出的结果 :

    { value: 1, done: false} 
    

    value: 表示当前的值,即yield 之后的返回,
    done: 表示当前的循环是否已经完成,true 为完成。
    函数的运行方式为
    (1), (3), (2), (3), (2), (3), (2)......
    正好可以验证我们之前所说的 “暂停”

    注意
    如果我们调用range函数, 第一次的返回值是一个空的 generator Object

    var kk = Range(1,10);
    console.log(kk);
    

    输出为:

    {}
    

    相关文章

      网友评论

          本文标题:迭代器,生成器和yield

          本文链接:https://www.haomeiwen.com/subject/rhmhcttx.html