重走es之迭代器

迭代器

遍历器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问 机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成 员)

作用:

  • 一是为各种数据结构,提供一个统一的、简便的访问接口
  • 二是使得数 据结构的成员能够按某种次序排列
  • 三是ES6创造了一种新的遍历命令for...of循环,Iterator接口主要 供for...of消费

迭代器的迭代过程

  1. 通过 Symbol.iterator 创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象
  2. 第一次调用指针对象的next()方法,可以将指针指向数据结构的第一个成员
  3. 随后通过 next()方法进行向下迭代指向下一个位置, next 方法会返回当前位置的对象,对象包含了 valuedone 两个属性, value 是当前属性的值, done 用于判断是否遍历结束
  4. 不断调用指针对象的next方法,直到它指向数据结构的结束位置,即当done 为 true 时则遍历结束
const items = ["1", "2", "3"];
const it = items[Symbol.iterator]();
console.log( it.next())  //{ value: '1', done: false }
console.log( it.next())   //{ value: '2', done: false }
console.log( it.next())   //{ value: '3', done: false }
//这里已经迭代完成,如果再调用next()方法,那么得到的就是{ value: undefined, done: true }
console.log( it.next())
//在进行遍历操作依旧是{ value: undefined, done: true },因为迭代在上述的三个打印语句中已经完成
for(let i =0;i<items.length;i++){
    console.log( it.next())
}

可迭代的数据结构

  • Array
  • String
  • Map
  • Set
  • arguments
  • TypedArray
  • NodeList

for...of可遍历的数据格式

Array

数组 ( Array ) 和类型数组 ( TypedArray ) 他们是可迭代的。

arr=[1,2,3]
for (const iterator of arr) {
    console.log(iterator)
}   //1  2   3

String

字符串是可迭代的,单他们遍历的是 Unicode 码,每个码可能包含一个到两个的 Javascript 字符。


Map

Map 主要是迭代它们的 entries ,每个 entry 都会被编码为 [key, value] 的项, entries 是以确定的形式进行迭代,其顺序是与添加的顺序相同。

const map = new Map();
map.set(0, "zero");
map.set(1, "one");
 
for (let item of map) {
  console.log(item);
}  //  [ 0, 'zero' ]    [ 1, 'one' ]

Set

Set 是对其元素进行迭代,迭代的顺序与其添加的顺序相同

const set = new Set();
set.add("zero");
set.add("one");
 
for (let item of set) {
  console.log(item);   //zero   one
}

argument

function args() {
    for (let item of arguments) {
      console.log(item);  //zero    one
    }
  }
  args("zero", "one");  

注意点:普通对象不可迭代

//普通对象不可迭代
let obj={
    name:'zhangsan',
    age:15
}
for (const iterator of obj) {
    console.log(iterator)   //报错    obj is not iterable
}

版权声明:本文为qq_40708840原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。