zoukankan      html  css  js  c++  java
  • ES6迭代器(Iterator)和生成器(Generator)

    平时我们迭代数据用得最多的应该就是for循环了

    来看个简单的例子

         var colors = ["red", "green", "blue"];
          for (var i = 0, len = colors.length; i < len; i++) {
              console.log(colors[i]);
          }
    

    如上循环是很简单,但是一旦使用多个循环嵌套时,就需要为每一个循环定义变量,来记录每一次执行迭代时所处集合中的位置,一不小心就会误用了其他for循环的变量,导致程序错误。然而迭代器可以简化操作,降低程序异常。接下来我们就一起看看什么事迭代器

    一、什么是迭代器

    迭代器:是一种特殊对象,他具有一些专门为迭代过程设计的专有接口,所有的迭代器对象都有一个next()方法,每次调用都返回一个结果对象。结果对象有两个属性:一个是value,表示下一个将要返回的值;另一个是done,他是一个布尔类型的值,在当没有可返回的数据时返回true,预示着迭代结束

    现在使用ECMAScript 5 语法构建一个迭代器:

     function createIterator() {
           var i = 0;
           return {
               next: function () {
                   var done = (i >= items.length);
                   var value = !done ? items[i++] : undefined;
                   return {
                       done: done,
                       value: value
                   }
               }
           }
       }
    
     var iterator = createInterator([1, 2, 3]);
     console.log(iterator.next()); // "{value:1,done:false}"
     console.log(iterator.next());// "{value:2,done:false}"
     console.log(iterator.next());// "{value:3,done:false}"
     console.log(iterator.next());// "{value:undefined,done:true}"
     // 当调用次数超过实际值后,不管再调用多少次结果都会是如下值
     console.log(iterator.next());// "{value:undefined,done:true}"
     
    

    在这个案例中createIterator()方法会返回一个对象,该对象拥有一个next()方法,每次调用next()方法,都会判断 i 是否大于等于 当前实参的长度;大于或等于时done 即为true,反之亦然。然后将done取反;当done为truevalue 赋值为undefined;否则将i+1,再取item 对应下标的值赋值于value。其实ES6迭代器实现原理和案例也就类似。

    二、什么是生成器

    生成器是一种返回迭代器的函数, 通过function 关键字后的星号(*)来表示,函数中会使用到新的关键字 yield。星号可以紧挨着function,也可以在中间添加一个空格。

    	// 在createIterator()前的 * 表示他是一个生成器
        function *createIterator() {
           yield 1;
           yield 2;
           yield 3;
        }
      //生成器的调用和 普通函数相同,只是他返回的是一个迭代器
      var iterator = createInterator();
      console.log(iterator.next().value); // 1
      console.log(iterator.next().value); // 2
      console.log(iterator.next().value); // 3    
      
    

    需要注意的是,每当执行完一条yield 乬后函数就会自动停止执行。 如上面的案例,当函数初始化执行完yield 1 之后,函数便不会向下执行,直到再次调用迭代器的next()方法才会继续向下执行yield 2语句

    • 今天先做个简单的了解,明天继续…
  • 相关阅读:
    LeetCode 55. 跳跃游戏(Jump Game)I II tag 数组 贪心 动态规划
    科学的意义
    umi前后端交互技术,通用型request配置
    TD demo在我们机器上
    Ubuntu挂载和登录服务器
    TD属性总结
    TD音乐界面添加keyboard的流程
    VS Code常用键
    TD打印 log方法
    TD自定义控件流程
  • 原文地址:https://www.cnblogs.com/dengxiaoning/p/11681265.html
Copyright © 2011-2022 走看看