zoukankan      html  css  js  c++  java
  • 533 js迭代器

    2.10. 迭代器

    遍历器(Iterator)就是一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作。

    Iterator 接口:对象的属性,属性名:Symbol.iterator ,属性值:函数。】

    1. ES6 创造了一种新的遍历命令 for...of 循环,Iterator 接口主要供 for...of 消费

    2. 原生具备 iterator 接口的数据(可用 for of 遍历)

    a) Array

    b) Arguments

    c) Set

    d) Map

    e) String

    f) TypedArray

    g) NodeList

    1. 工作原理

    a) 创建一个指针对象,指向当前数据结构的起始位置 【由Symbol.iterator对应的函数创建】

    b) 第一次调用【返回的】对象的 next 方法,指针自动指向数据结构的第一个成员

    c) 接下来不断调用 next 方法,指针一直往后移动,直到指向最后一个成员

    d) 每调用 next 方法返回一个包含 value 和 done 属性的对象

    注: 需要自定义遍历数据的时候,要想到迭代器


    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>迭代器</title>
    </head>
    
    <body>
      <script>
        const xiyou = ['唐僧', '孙悟空', '猪八戒', '沙僧'];
    
        // 使用 for...of 遍历数组
        for (let v of xiyou) {
          console.log(v);
        }
    
        let iterator = xiyou[Symbol.iterator]();
        // 原型对象上有next方法、Symbol(Symbol.toStringTag): "Array Iterator"
        console.log(iterator); 
    
        // 调用对象的next方法
        console.log(iterator.next()); // {value: "唐僧", done: false}
        console.log(iterator.next());
        console.log(iterator.next());
        console.log(iterator.next());
        console.log(iterator.next()); // {value: undefined, done: true}
      </script>
    </body>
    
    </html>
    

    迭代器自定义遍历对象

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>自定义遍历数据</title>
    </head>
    
    <body>
      <script>
        //声明一个对象
        const banji = {
          name: "哈哈",
          stus: [
            'xiaoming',
            'xiaoning',
            'xiaotian',
            'knight'
          ],
          [Symbol.iterator]() {
            let index = 0; // 索引变量
            let _this = this;
            return {
              next: function () {
                if (index < _this.stus.length) {
                  const result = { value: _this.stus[index], done: false };
                  index++; // 下标自增
                  return result; // 返回结果
                } else {
                  return { value: undefined, done: true };
                }
              }
            };
          }
        }
    
        for (let v of banji) {
          console.log(v);
        }
      </script>
    </body>
    
    </html>
    
  • 相关阅读:
    python txt文件数据转excel
    数字的可视化:python画图之散点图sactter函数详解
    Python使用matplotlib模块绘制多条折线图、散点图
    python 读取文件时报错UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multibyte sequence
    Python Requests post并将得到结果转换为json
    Python按行读取文件、写文件
    重装系统后,指纹识别无法使用
    MySQL的简单使用和JDBC示例
    resin后台输出中文乱码的解决办法!
    MySQL时间增加、字符串拼接
  • 原文地址:https://www.cnblogs.com/jianjie/p/13679967.html
Copyright © 2011-2022 走看看