• 遍历器Iterator--指针对象


    一. 什么是遍历器

    1. 遍历器对象(Iterator)

    遍历器对象本质上是一个指针对象,该对象有一个next方法,调用next方法返回一个

    含有value和done属性的对象{value: val/undefined, done: false/true}。

    const iterator = {
       next() {
          return {value: val/undefined, done: false/true}
       }
    }

    另外遍历器对象可以简单的通过Generator函数(遍历器生成函数)生成。

    const gen = function* testGen(){ yield ....}

    2. iterator接口

    也可以叫做遍历器生成函数。一些数据称之为可遍历数据,本质上是因为数据结构

    本身带有iterator接口,即具有属性[Symbol.iterator],该属性对应一个遍历器生成函数。

    iterator接口对应的遍历工具主要是for...of循环。其余工具还有: ...(扩展运算符)、Array.from()等。

    使用这些工具的时候,会默认调用[Symbol.iterator]方法,遍历方法返回的遍历器。

    所以,一个数据是否可遍历,取决于是否具有[Symbol.iterator]属性。

    而可以通过给数据添加该属性,使本身不可遍历的数据变成可遍历数据。

    原生具有iterator接口的数据类型有:

    Array
    String
    Map
    Set
    TypedArray
    Arguments对象
    NodeList对象

    除了上面的数据类型,其他数据类型想要可遍历,都必须添加[Symbol.iterator]属性。

    其中类数组的对象,可以直接使用数组的[Symbol.iterator]属性。其他对象不可以!

    let iterable = { //属性值是数值和length
      0: 'a',
      1: 'b',
      2: 'c',
      length: 3,
      [Symbol.iterator]: Array.prototype[Symbol.iterator] //不添加该属性之前,不可遍历,类数组只有NodeList,Arguments,String可遍历
    };
    for (let item of iterable) {
      console.log(item); // 'a', 'b', 'c'
    }

    如果自定义的话,可以使用Generator函数赋值。

    也可以自定义一个函数,按照遍历机制生成一个遍历器对象。不符合会导致崩溃。

    3. iterator接口使用场合

    以下场景自动调用iterator的构造函数。

    1.解构赋值

    数组/Set/Map的解构赋值

    let [a,...b] = [1,2,3,4];
    a;// 1
    b;// [2,3,4]

    对象的解构赋值

    let { foo, ...bar} = {foo: 1, a:1, b:2,c:3}
    foo; // 1
    bar; // {a:1,b:2,c:3}

    2. 扩展运算符

    3.yield*

    后面是一个遍历器,即可遍历对象。相当于自动调用for...of循环

    let generator = function* () {
      yield 1;
      yield* [2,3,4];
      yield 5;
    };
    // 相当于
    let generator = function* () {
      yield 1;
      for(let i of [2,3,4]) {
        yield i;
      }
      yield 5;
    };

    4.使用数组传参的方法

    数组只会遍历键是数字的值。非数字的键名不遍历。

    for...of
    Array.from()
    Set()
    Map()
    WeakMap
    WeakSet
    Promise.all()
    Promise.race()

    4. 遍历器的return方法和throw方法

    详见

    return方法非正常触发的条件是:

    1)for...of循环遇到break

    2) for...of循环中抛出异常

    其中如果遇到抛出异常,会先调用return方法,然后再抛出异常

    5. 遍历方法返回遍历器的数据结构

    数组
    Set
    Map
    URLSearchParams

    上面数据结构调用keys(),values(),entries()返回一个遍历器对象

    let arr = [12];
    arr.r  = 2;
    // 返回一个遍历器对象
    let it = arr.keys(); //Array Iterator
    it.next(); //{value: 0, done: false}
    it.next();// {value:undefined, done:true}
    // 由此可知,数组遍历的时候只遍历键名是数值的成员

    6. for...of循环优点

    1. 比for循环书写简单

    2.forEach不能中断,for...of可以中断

    3.for...in主要用于遍历对象,用于数组时,会遍历非数值的键名。

    详情查询

  • 相关阅读:
    Android strings.xml中定义字符串显示空格
    Android各国语言对照表(values-xxx)
    SimInfo获取(MCC, MNC, PLMN)
    Android APN
    Android studio 运行java程序
    [MyBatis]DAO层只写接口,不用写实现类
    idea代码调试debug篇
    比较分析 Spring AOP 和 AspectJ 之间的差别
    maven进阶:一个多模块项目
    Maven最佳实践:划分模块
  • 原文地址:https://www.cnblogs.com/lyraLee/p/11812727.html
Copyright © 2020-2023  润新知