ES6—迭代器:for... of 循环的原理是什么

本文介绍了JavaScript中的迭代器接口及其在for...of循环中的应用。通过实例展示了如何使用for...of遍历数组、字符串等原生具备Iterator接口的数据结构,并解释了迭代器的工作原理。同时,文章探讨了如何为自定义数据结构添加Iterator接口以实现遍历,以《红楼梦》角色为例,展示了如何在对象中部署Iterator接口进行面向对象的遍历。
摘要由CSDN通过智能技术生成

迭代器的介绍:

迭代器(Iterator)是一种接口,为不同的数据结构提供统一的访问机制。任何数据结构只要部署

Iterator 接口,就可以完成遍历操作。

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

const role = ['狼人','预言家','村民','女巫']
// for...of 遍历的是 value
for(let i of role){
    console.log(i)//狼人,预言家,村民,女巫
}
// for...in 遍历的是 key
for(let i in role){
    console.log(i) //1,2,3,4
}

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

        Array  Arguments  Set  Map  String  TypeArray  NodeList

const role = ['狼人','预言家','村民','女巫']
console.log(role) //具备 Iterator 接口

3.工作原理

        a. 创建一个指针对象,指向当前数据结构的起始位置

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

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

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

const role = ['狼人','预言家','村民','女巫']
// 先找到 role 这个 数组 的 对象,然后()获取这个对象的值
let iterator = role[Symbol.iterator]() 
// 调用对象的 next 方法 包含 value 和 done 属性 done 表示还没遍历完成
console.log(iterator.next())//第一次,指针自动指向第一个
console.log(iterator.next())//指针不断往后移
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())//找到第五个,没有数据了

 迭代器的应用:

自定义遍历数据

const book = {
    name:"红楼梦",
    role:[
        "薛宝钗",
        "林黛玉",
        "王熙凤"
    ]
}

for(let i of book){
    console.log(i) //会报错,因为对象中没有 Iterator 接口,不能使用 for...of 遍历
}

//这里虽然可以用 for...in 遍历,但是遍历的是对象中的 key 值
//也可以用 foreach 遍历,但是不符合面向对象的思维,在直接操作对象

//解决的办法,符合面向对象
const book = {
    name:"红楼梦",
    role:[
        "薛宝钗",
        "林黛玉",
        "王熙凤"
    ],
    //在对象部署 Iterator 接口 就可以完成遍历,根据工作原理添加 Iterator
    [Symbol.iterator](){
        //索引变量
        let index = 0
        next:()=>{ //这里用箭头函数,this 指向目前book作用域
            if(index<this.role.length){
                const result = {value:this.role[index],done:false}
                   index++
                return result
            }else{
                return {value:underfined,done:true}
            }
        }
    }
}

for(let i of book){
    console.log(i) //打印结果如下
}

 

 

PS:欢迎指正~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值