[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: 可迭代對象的初級使用場景

相關文章
相關標籤/搜索