zoukankan      html  css  js  c++  java
  • es6之Iterator

    1.任何数据结构只要部署了Iterator接口(本质是一个指针对象),也就是部署了Symbol.iterator属性,便可以完成遍历操作;数组原生就具备Iterator接口,就可以用for...of遍历。由于Iterator只是把接口规格加到数据结构之上,所以,遍历器与它所遍历的那个数据结构,实际上是分开的。

    2.Iterator遍历过程:

       - 创建一个指针对象,指向当前数据结构的起始位置;

       - 调用next方法,可以将指针指向数据结构的第一个成员,返回一个包含value和done属性的对象;

       - 继续调用next方法,......以此类推,直到指向结束位置。

    //mock iterator
    function makeIterator(array) {
      var nextIndex = 0;
      return {
        next: function() {
          return nextIndex < array.length ?
            {value: array[nextIndex++], done: false} :
            {value: undefined, done: true};
        }
      };
    }
    
    var arr = makeIterator([1, 2, 3]);
    
    arr.next(); //{value: 1, done: false}
    arr.next(); //{value: 2, done: false}
    arr.next(); //{value: 3, done: false}
    arr.next(); //{value: undefined, done: true}

    3.调用Iterator的场合(即会默认调用Symbol.iterator):

      - 解构赋值

      - 扩展运算符(...)

      - yield*(后面跟一个可遍历的结构)

      - 任何接收数组作为参数的场合(for...of等)

    4.字符串也具有Iterator接口(typeof str[Symbol.iterator] === 'function')

    5.Symbol.iterator可以用Generator函数实现,只要用yield命令给出每一步的返回值即可。

    var obj = {};
    obj[Symbol.iterator] = function* () {
        yield 1;
        yield 2;
    }
    
    [...obj] // [1, 2]

    6.for...of适用于数组、Set、Map、类数组对象(arguments、nodelist)、Generator、字符串。

    7.for...in 和 for...of

      - 前者只能获取对象的键名,后者可以得到键值;

      - 对于数组,前者可以返回数组上的所有属性,后者只能返回具有数字索引的属性;

    let arr = ['a', 'b', 'c'];
    arr.d = 'hello';
    
    for (let i in arr) {
      console.log(i); // '0', '1', '2', 'd'
    }
    
    for (let i of arr) {
      console.log(i); //  'a, 'b', 'c'
    }

      - 前者主要为遍历对象而设计;不适用与遍历数组;

      - 后者不同于foreach,可与break、continue、return配合使用;提供了遍历所有数据结构的统一接口。

    8.iterator对象除了next方法,还有return、throw,而return必须返回一个对象。

    9.fibonacci

    var fib = {
      [Symbol.iterator](){
        let pre=0,cur=1;
        return {
          next(){
            [pre, cur] = [cur, pre+cur];
            return {done: false,value: cur};
          }
        }
      }
    }
    for(var i of fib){
      if(i>100)
        break;
      console.log(i)
    }
  • 相关阅读:
    javascript 的原型与原型链的理解
    mysql 复制原理与实践
    mysql 数据库备份的多种方式
    mysql 事务中如果有sql语句出错,会导致自动回滚吗?
    【原】ios下比较完美的单例模式,已验证
    【原/转】ios指令集以及基于指令集的app包压缩策略
    【原】多线程编程中临界区与互斥锁的区别
    【转】Windows的多线程编程,C/C++
    【转】c++中Vector等STL容器的自定义排序
    【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
  • 原文地址:https://www.cnblogs.com/colima/p/6900804.html
Copyright © 2011-2022 走看看