zoukankan      html  css  js  c++  java
  • 遍历器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主要用于遍历对象,用于数组时,会遍历非数值的键名。

    详情查询

  • 相关阅读:
    NYOJ 625 笨蛋的难题(二)
    NYOJ 102 次方求模
    ZJU Least Common Multiple
    ZJUOJ 1073 Round and Round We Go
    NYOJ 709 异形卵
    HDU 1279 验证角谷猜想
    BNUOJ 1015 信息战(一)——加密程序
    HDU 1202 The calculation of GPA
    "蓝桥杯“基础练习:字母图形
    "蓝桥杯“基础练习:数列特征
  • 原文地址:https://www.cnblogs.com/lyraLee/p/11812727.html
Copyright © 2011-2022 走看看