es6的iterator和for of循环

本文介绍了ES6中新增的for-of循环语法及其使用场景,包括遍历数组、DOM对象、Map和Set等数据结构的方法,并探讨了如何为自定义对象实现iterator接口以支持for-of循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遍历一个数组的元素一般都会想起for循环:

for (var index = 0; index < myArray.length; index++) {
  console.log(myArray[index]);
}
  • 1
  • 2
  • 3

然而,在ES5中已经提出了更为简便的forEach方法,代码如下:

myArray.forEach(function (value) {
  console.log(value);
});
  • 1
  • 2
  • 3

虽然forEach方法简短一点,但是它也有它的缺点,就是不能够break来中途退出循环,也不能通过return来退出循环

还有for-in方法:

for (var index in myArray) {    
  console.log(myArray[index]);
}
  • 1
  • 2
  • 3

可是for-in方法实际上是为存储key的键值对型 对象 

准备的,而不是为数组准备的,它的下标为字符串“1”,“2”

for-of循环

ES6推出一种新的循环语法for-of:

for (var value of myArray) {
  console.log(value);
}
  • 1
  • 2
  • 3

对比for-in和for-of

var a = ["a","b","c","d","e"];
for (var idx in a) {
     console.log( idx ); 
     }// 0 1 2 3 4 

for (var val of a) {
     console.log( val ); 
     }// "a" "b" "c" "d" "e"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

for-of不仅仅可以用于数组,还可以用在dom对象上,同样作用于Map和Set对象

for-of如何作用于Set对象上的:

var uniqueWords = new Set(words);
for (var word of uniqueWords) {
  console.log(word);
}
  • 1
  • 2
  • 3
  • 4

遍历Map对象则不同,因为Map是以键值对存储的,所以我们需要分开两个单独的变量来遍历:

for (var [key, value] of phoneBookMap) {
  console.log(key + "'s phone number is: " + value);
}for(let [index,item] of omit.entries(){	self.omit.set(index,item)}//给map数据结构的omit赋值。

  • 1
  • 2
  • 3

但是需要注意一点。for-of并不是用来遍历普通的对象的属性的,如果我们一定要这么做,可以使用for-in或者如下方法:

for (var key of Object.keys(someObject)) {
  console.log(key + ": " + someObject[key]);
}

iterator

如果没有iterator接口,就不能进行for of 循环

如果想要进行for of 循环,在没有iterator的情况下,需要先部署iterator接口

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
{
    console.log("lesson3加载");
    //iterator 基本用法  iterrator在数组中本身就有
    let arr=["hello","word"];
    let map=arr[Symbol.iterator]();
    console.log("1",map.next());
    console.log("2",map.next());
    console.log("3",map.next());
}
 
{
    //自定义iterator,要想使用for of循环遍历对象,必须自定义iterator
    let obj={
        start:[1,3,2],
        end:[7,8,9],
        [Symbol.iterator](){//接口函数
            let self=this;//函数体,按需求写
            let index=0;
            let arr=self.start.concat(self.end);
            let len=arr.length;
            return {//该接口函数最后返回一定要包含next()方法,next()方法返回的值有两个一个value,一个done
                next(){
                    if(index<len){//next方法里写遍历的过程
                        return {
                            value:arr[index++],//value是值
                            done:false//done循环是否还有,有的话是false,没有的话是true
                        }
                    }else{
                        return {
                            value:arr[index++],
                            done:true
                        }
                    }
                }
            }
        }
    }
 
    for(let key of obj){ //验证是否有接口函数,有才能执行for of循环
        console.log(key);
    }
 
 
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值