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

    1、数组默认实现了迭代器,所以可以通过for of遍历

    2、对象没有实现迭代器,所以不能通过for of 遍历

    3、Array[Symbol.iterator] 对应是一个函数,这个函数返回一个对象,对象中有个next方法,next方法返回一个对象{value:"",done:false}

    4、for...of,我们可以使用它来遍历数组,字符串,Set和Map结构,但for…of不遍历object对象

    5、 for...of的原理就是:先调用可遍历对象的[Symbol.iterator]()方法,得到一个iterator遍历器对象,然后就在遍历器上不断调用next()方法,直到done的值为true的时候,就表

    示遍历完成结束了。

    迭代器实例与对象自定义迭代器实例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    let obj = {
        name: "张三",
        age: 19
    }
     
    // for (let i of obj){
    //     console.log(i);//对象不能遍历
    // }
     
    let arr = [1, 2, 3, 4, 5]
    console.log(obj[Symbol.iterator])//对象不能遍历
    console.log(arr[Symbol.iterator])//返回一个函数
     
    console.log(arr[Symbol.iterator]())
     
    let iter = arr[Symbol.iterator]();//返回迭代器的实例 用next()方法
    console.log(iter.next());//1 false
    console.log(iter.next());//2 false
    console.log(iter.next());//3 false
    console.log(iter.next());//4 false
    console.log(iter.next());//5 false
    console.log(iter.next());//undefined true
    console.log(iter.next());//undefined true
    console.log(iter.next());//undefined true
     
     
     
    //给对象加迭代器 自定义迭代器
    obj[Symbol.iterator] = function () {
        let index = 0;
        let keys = Object.keys(this);
     
        return {
     
            //this指向不是当前 解决箭头函数
            // next(){
            //     let value = this[keys[index]]
            //     let done = index===keys.length
            //     index++;
            //     return {
            //         value,
            //         done
            //     }
            // }
            // 箭头函数
            // next()函数遍历出属性名与值
            next: () => {
                let value = {
                    key: keys[index],//对象属性名
                    value: this[keys[index]]//对象属性值
                }
                let done = index === keys.length//长度
                console.log(done);
                index++;
                return {
                    value,
                    done
                }
            }
        }
    }
    for (var i in obj){
        console.log(i)
    }
    for (let item of obj) {
        console.log(item);
    }

      

     

  • 相关阅读:
    Android签名详解(debug和release)
    Java反射机制的学习
    Android应用开发中如何使用隐藏API(转)
    asp.net购物车,订单以及模拟支付宝支付(二)---订单表
    asp.net购物车,订单以及模拟支付宝支付(一)---购物车表及添加购物车流程
    asp.net权限控制的方式
    .Net使用程序发送邮件时的问题
    Word2016“此功能看似已中断 并需要修复”问题解决办法
    C#字符串来袭——因为爱,所以爱
    C#时间的味道——任时光匆匆我只在乎你
  • 原文地址:https://www.cnblogs.com/wangxue13/p/13604631.html
Copyright © 2011-2022 走看看