[es6-迭代器iterator和生成器generator][2] - 可迭代对象

1: 什么是可迭代对象?数组

1: 可迭代对象具备Symbol.iterator属性
2: Symbol.iterator是一个方法
3: Symbol.iterator的返回值是一个迭代器
4: 结合以上第二点和第三点,能够得出Symbol.iterator就是一个生成器

因此咱们能够给出一个可迭代对象的明肯定义就是:一个具备Symbol.iterator属性,且其为一个生成器的对象,就是可迭代对象app

2: 如何建立一个可迭代对象?
有了上面的第一点的定义,咱们就能够建立出一个可迭代对象,以下:this

let myIteratorObject = {
    items: [],
    *[Symbol.iterator](){
        for(let item of this.items){
            yield item;
        }
    }
};

myIteratorObject.items = [1, 2, 3];
for(let item of myIteratorObject){
    console.log(item);//依次获得1, 2, 3
}

3: ES6默认的可迭代对象有哪些?
从前面的内容咱们知道,并非全部的对象都是可迭代对象,咱们本身建立的对象,必需要手动添加*[Symbol.iterator]这个生成器才行。可是ES6内建的对象,有一些默认就是可迭代对象,毋需咱们再作额外的工做。它们就是如下这些:code

1: 数组Array
2: Set
3: Map
4: 字符串String
5: NodeList(准确说来是定义在DOM标准中)

4: 集合对象(Array, Set, Map)的内建迭代器有几种?
从上面的第三点咱们知道Array, Set, Map它们默认就是可迭代对象,这说明它们默认就有迭代器。而这三个集合对象,不只有默认迭代器,并且还不止1个,有3个:对象

1: entries() 返回一个迭代器,其值为多个键值对
2: values()  返回一个迭代器,其值为集合的值
3: keys()    返回一个迭代器,其值为集合中的全部键名

下面经过代码来来看一下使用这三种不一样的集合所对应的三种不一样的迭代器获得的数据是什么:字符串

let array = [1, 2, 3];
let set = new Set(['a', 'b', 'c']);
let map = new Map();
map.set('name', 'apple');
map.set('price', 20);

//entries()
for (let item of array.entries()) {
    console.log(item);
}
for (let item of set.entries()) {
    console.log(item);
}
for (let item of map.entries()) {
    console.log(item);
}
//values()
for(let item of array.values()){
    console.log(item);
}
for(let item of set.values()){
    console.log(item);
}
for(let item of map.values()){
    console.log(item);
}

//keys()
for(let item of array.keys()){
    console.log(item);
}
for(let item of set.keys()){
    console.log(item);
}
for(let item of map.keys()){
    console.log(item);
}

entries()it

[0, 1]
[1, 2]
[2, 3]
["a", "a"]
["b", "b"]
["c", "c"]
["name", "apple"]
["price", 20]

values()console

1
2
3
a
b
c
apple
20

keys()List

0
1
2
a
b
c
name
price

从以上结果咱们看出,yield

1: 对于Array来讲,会把元素下标做为每个“键值对”的key;
2: 对于Set来讲,集合元素自己既是key,又是value;
3: Map就是最标准的key就是key,value就是value啦。

5: 集合对象的默认迭代器是什么?
从上面的第4点咱们知道了,Array,Set,Map这三种集合对象都内建了三种不一样的迭代器,可是若是当咱们在使用for...of的时候,不是十分肯定地指定某一种迭代器,那这三个对象会默认使用哪一个呢?

let array = [1, 2, 3];
let set = new Set(['a', 'b', 'c']);
let map = new Map();
map.set('name', 'apple');
map.set('price', 20);
for(let item of array){
    console.log(item);
}
for(let item of set){
    console.log(item);
}
for(let item of map){
    console.log(item);
}

咱们会获得如下结果:

1
2
3
a
b
c
["name", "apple"]
["price", 20]

因此结论就是:

1: Array的默认迭代器是values()
2: Set的默认迭代器是values()
3: Map的默认迭代器是entries()

6: 可迭代对象的初级使用场景

相关文章
相关标签/搜索