遍历器对象和可遍历对象

1 iterator 遍历对象

1.1 什么是遍历器对象

iterator(遍历器对象,也译为迭代器对象)是一种接口,为各种不同的数据提供统一的访问机制,任何数据只要部署了 iterator 接口就可以进行遍历操作。

1.2 遍历器对象的特点

1. 每个遍历器都有一个 next() 方法
2. 遍历器对象内部存在一个指针,初始指向遍历器对象中的第一个数据,调用 next() 会取出当前指针指向的数据,并且指针下移。
3. 每次调用 next() 方法,返回对象,对象中包含 value 属性 和 done 属性, value 属性就是当前指针指向的数据的值,done 属性是一个布尔值,表示是否结束遍历。
 // 创建数组
const arr = [100,200,300,400,500,600];
// 得到数组元素的值组成的遍历器对象
const iter01 = arr.values();
console.log(iter01.next());  // {value:100, done:false}
console.log(iter01.next());  // {value:200, done:false}
console.log(iter01.next());  // {value:300, done:false}
console.log(iter01.next());  // {value:400, done:false}
console.log(iter01.next());  // {value:500, done:false}
console.log(iter01.next());  // {value:600, done:false}
console.log(iter01.next());  // {value:undefined, done:true}
console.log(iter01.next());  // {value:undefined, done:true}
console.log('');



// 得到数组元素的索引组成的遍历器对象
const iter02 = arr.keys();
// 利用 while 取出遍历器中的数据
while (true) {
    let item = iter02.next();
    if (item.done) {
        break;
    }
    console.log(item.value);
}
console.log('');



// 得到数组元素的索引和值共同组成的遍历器对象
const iter03 = arr.entries();
// 可以使用 for of 结构遍历遍历器对象
for (let v of iter03) {
    console.log(v);
}

1.3 得到遍历器对象的一些方法

数组实例: keys() values() entries()
Set实例: keys() values() entries()
Map实例: keys() values() entries()
...

2 iterable 可遍历对象

2.1 什么是可遍历对象

1)把部署了 iterator 接口(遍历器接口)的数据结构称为 iterable(可遍历对象,也译为可迭代对象)。

2)iterator 部署在了可遍历对象的 Symbol.iterator 属性上,该属性是一个方法,这个方法返回一个遍历器对象。

const obj = {
  [Symbol.iterator] : function () {
    return {
      next: function () {
        return {
          value: 1,
          done: true
        };
      }
    };
  }
};

2.2 系统内置的可遍历对象

Array 的实例
Set 的实例
Map 的实例
字符串
arguments
NodeList
HTMLCollection
....

2.3 哪些情况会调用可遍历对象的遍历器接口

1. 使用 for of 遍历可遍历对象
2. 数组的解构赋值,所有可遍历对象都可以被解构
3. Array.from() 该方法可以把可遍历对象转为数组
4. 使用扩展运算符将可遍历对象分割为逗号隔开的参数序列
5. Set 构造函数的参数,要求是可遍历对象
6. WeakSet 构造函数的参数,要求是可遍历对象
7. Map 构造函数的参数,要求是可遍历对象
9. WeakMap 构造函数的参数,要求是可遍历对象
9. Promise.all() 的参数
10. Promise.race() 的参数
....

2.4 可遍历对象(iterable)和遍历器对象(iterator)的关系

1. 所有的遍历器对象都是可遍历的,可遍历对象并不是遍历器对象。
2. 所有的可遍历对象都可以通过遍历器接口获取到与之对应的遍历器。

2.5 可遍历对象(iterable)和伪数组(Like-Array)的关系

1. 伪数组指的是像数组一样具有索引结构,由多个数据组成的不是数组的数据类型
2. 可遍历对象指的是部署了遍历器接口的对象
3. 二者是完全不同的两个概念, String、Arguments、NodeList、HTMLCollection 既是伪数组又是可遍历对象; Set、Map 不是伪数组是可遍历对象。

results matching ""

    No results matching ""