【JS014】ES6的学习笔记之迭代器(Iterator)

本文详细介绍了JavaScript中迭代器的概念、工作原理,以及如何通过自定义迭代器实现数据结构的遍历。重点展示了如何使用for...of...进行遍历,并通过实例演示了对象如何实现Iterator接口以配合for...of...使用。
摘要由CSDN通过智能技术生成

日期:2021年8月31日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006
如果您想了解更多有关javascript的知识,那么请点《javascript学习的奇妙之旅》



一、迭代器初识

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

  • 遍历语法:for...of...
  • 遍历条件:部署Iterator接口的数据结构
  • 原生具备Iterator接口的数据:
序号数据
1Array
2Arguments
3Set
4Map
5String
6TypedArray
7NodeList

在这里插入图片描述

let arr = [1,2,3,4];
console.log(arr);
//控制台输出:(4) [1, 2, 3, 4]

console.log(arr[Symbol.iterator]());
//控制台输出:Array Iterator {}

for(let item of arr){
    console.log(item);
};
//控制台输出:
//1
//2
//3
//4

二、迭代器工作原理

  • 创建一个指针对象,指向当前数据结构的起始位置
  • 第一次调用对象的next方法,指针自动指向数据结构的第一个成员
  • 接下来不断调用next方法,指针一直往后移动,直到只想最后一个成员;
  • 每次调用next方法,将会返回一个包含valuedone属性的对象;
  • 当指针指向最后一个成员,再次调用next方法,将会返回一个包含value=undefineddone=true属性的对象,其中done=true表示已经完成工作,value值则为未定义undefined

在这里插入图片描述

let arr = [11,22,33,44];

for(let item of arr){
    console.log(item);
};
//控制台输出:
//11
//22
//33
//44

//(0)迭代器
let iterator = arr[Symbol.iterator]();
console.log(iterator);       //Array Iterator {}

//(1)第一次调用,指向数据结构的第一个成员
console.log(iterator.next());//{value: 11, done: false}

//(2)不断调用,指针不断往后移动
console.log(iterator.next());//{value: 22, done: false}
console.log(iterator.next());//{value: 33, done: false}
console.log(iterator.next());//{value: 44, done: false}

//(3)超过最后一个成员
console.log(iterator.next());//{value: undefined, done: true}

三、迭代器实现数据结构的自定义遍历

任何数据结构只要部署Iterator接口,那么就是可迭代的for...of...可以完成遍历操作

  • 对象原生不支持for...of...遍历
    在这里插入图片描述
o = {
    name:"张三",
    age:18,
    sex:"female"
}

//(1)for...in...不可以遍历
for(let k in o){
    console.log(k,o[k]);
}
//控制台输出:
//name 张三
//age 18
//sex female

//(2)for...of...不可以遍历
for(let v of o){
    console.log(v);
}
//控制台输出:
//Uncaught TypeError: o is not iterable
  • 对象实现Iterator接口,可以for...of...遍历
o = {
    name:"张三",
    age:18,
    sex:"female",
    [Symbol.iterator](){
        //部署Iterator接口

        let aryKey = Object.keys(o);
        //console.log(aryKey);
        //(3) ["name", "age", "sex"]
        
        let index = 0;
        return {
            next:function(){
                if(index<aryKey.length){
                    //正在进行遍历工作
                    const result = {value:aryKey[index],done:false}
                    index++;
                    return result;
                }else{
                    //已经完成了遍历工作
                    return {value:undefined,done:true}
                }
            }
        };

    }
}

for(let k of o){
    console.log(k,o[k]);
}
//控制台输出:
//name 张三
//age 18
//sex female

版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/120015456

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Commas.KM

码路共同进步,感恩一路有您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值