迭代器和迭代协议

1/16/2023

# 迭代器的概念

迭代器是指具有next()方法的对象,用于迭代可迭代对象中的元素。每次调用next()方法都会返回一个包含valuedone属性的对象,用于表示迭代器当前所指向的元素和迭代是否已经结束。

# 迭代器的实现

迭代器可以自定义实现,例如以下是一个简单的迭代器实现:

const myIterable = {
  [Symbol.iterator]: function* () {
    yield 1;
    yield 2;
    yield 3;
  }
}

const myIterator = myIterable[Symbol.iterator]();

console.log(myIterator.next()); // { value: 1, done: false }
console.log(myIterator.next()); // { value: 2, done: false }
console.log(myIterator.next()); // { value: 3, done: false }
console.log(myIterator.next()); // { value: undefined, done: true }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

以上代码中,myIterable是一个自定义的可迭代对象,它具有Symbol.iterator方法,返回一个生成器函数。生成器函数中使用yield语句返回可迭代对象中的元素。myIterator是使用迭代器协议从myIterable中获取的迭代器,每次调用next()方法都会返回生成器函数中yield语句返回的值。

# 迭代协议的概念和实现

迭代协议是指指定一个可迭代对象必须具有Symbol.iterator方法的协议。该方法必须返回一个迭代器对象,用于迭代可迭代对象中的元素。实现迭代协议的对象可以使用for...of语句或手动迭代器来遍历可迭代对象中的元素。

以下是一个实现迭代协议的简单例子:

const myIterable = {
  data: [1, 2, 3],
  [Symbol.iterator]: function () {
    let index = 0;
    return {
      next: () => {
        if (index < this.data.length) {
          return { value: this.data[index++], done: false };
        } else {
          return { done: true };
        }
      }
    }
  }
}

for (let element of myIterable) {
  console.log(element);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

以上代码中,myIterable是一个自定义的可迭代对象,具有Symbol.iterator方法,返回一个迭代器对象。迭代器对象包含next()方法,用于遍历可迭代对象中的元素。在for...of语句中使用myIterable对象时,会自动调用迭代器的next()方法,从而遍历可迭代对象中的元素。

总之,迭代器是指具有next()方法的对象,用于迭代可迭代对象中的元素。迭代协议是指指定一个可迭代对象必须具有Symbol.iterator方法的协议。实现迭代协议的对象可以使用for...of语句或手动迭代器来遍历可迭代对象中的元素。

编辑时间: 1/25/2023, 9:05:20 AM