← 返回首页
Javascript基础教程(十八)
发表时间:2020-03-28 13:24:30
讲解Javascript的Iterable

遍历Array可以采用下标循环,遍历Map和Set就无法使用下标,因为Map与Set都没有索引。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型。

具有iterable类型的集合可以通过新的for ... of循环来遍历。

1.for of遍历

例如: 把上节的Map与Set使用for ...of遍历。

<script>
    let arr = [1,2,3,4,5];
    let map = new Map([['北京', "010"], ['上海', "021"], ['广州', "020"],['东京', "000"]]);
    let set = new Set(['orange','banana','apple']);

    for(let i of arr){
        console.log(i);
    }

    for(let m of map){
        console.log(m);
        console.log(m[0]+"="+m[1]);
    }

    for(let s of set){
        console.log(s);
    }
</script>

运行结果:

2.for of与for in区别

for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。

当我们手动给Array对象添加了额外的属性后,for ... in循环将带来意想不到的意外效果。

例如:

<script>
    let arr = [1,2,3,4,5];
    arr.title='数组标题';
    for(let e in arr){
        console.log(e);
    }

    for(let e of arr){
        console.log(e);
    }
</script>

运行结果:

我们发现 for in 遍历出来的并不是元素值,而是属性。

for in 可以遍历对象的属性和属性值,而for of不可以,看下面的例子:

let person = {
     name: '张三',
     age: 20,
     gender: '男',
     address: '西安市雁塔区鱼化寨',
     eat: function () {
        console.log(this.name + "正在吃饭....")
    }
}


console.log("-------------使用for in 遍历--------------------");
for(let attr in person){
   console.log(attr);
   console.log(person[attr])
}

console.log("-------------使用for of 遍历--------------------");
for(let value of person){
   console.log(value);
}


运行结果:

--------------使用for in-------------------
name
张三
age
20
gender
男
address
西安市雁塔区鱼化寨
eat
ƒ () {
            console.log(this.name + "正在吃饭....")
        }
--------------使用for of-------------------
Uncaught TypeError: person is not iterable