返回

ES6 中的 Iterator(遍历器)与 for of 循环 - 一个深层探索

前端

Iterator 接口是一种允许遍历对象元素的标准方法。它定义了两个方法:next()Symbol.iteratornext() 方法返回一个包含当前元素和 done 属性的对象,done 属性指示遍历是否已完成。Symbol.iterator 方法返回一个初始指向第一个元素的迭代器对象。

for of 循环是 ES6 中引入的一种新的循环结构,它使用 Iterator 接口来遍历数据结构。for of 循环的语法如下:

for (const element of iterable) {
  // 在这里处理每个元素
}

iterable 是一个具有 Symbol.iterator 方法的对象,例如数组、字符串、Set 和 Map。for of 循环将自动调用 Symbol.iterator 方法来获取迭代器对象,然后使用 next() 方法遍历该对象中的元素。

Iterator 接口和 for of 循环在许多场景中都有应用,例如:

  • 遍历数组或字符串:
    const numbers = [1, 2, 3, 4, 5];
    for (const number of numbers) {
      console.log(number); // 输出: 1 2 3 4 5
    }
    
  • 遍历 Set 或 Map:
    const set = new Set([1, 2, 3, 4, 5]);
    for (const number of set) {
      console.log(number); // 输出: 1 2 3 4 5
    }
    
  • 遍历对象:
    const person = {
      name: 'John Doe',
      age: 30,
      city: 'New York'
    };
    for (const key of Object.keys(person)) {
      console.log(key); // 输出: name age city
    }
    
  • 生成器函数:
    生成器函数是一种特殊类型的函数,它可以暂停执行并返回一个值,然后在以后继续执行。生成器函数使用 yield 来实现暂停和返回。
    function* fibonacci() {
      let a = 0, b = 1;
      while (true) {
        yield a;
        [a, b] = [b, a + b];
      }
    }
    
    const fib = fibonacci();
    console.log(fib.next().value); // 输出: 0
    console.log(fib.next().value); // 输出: 1
    console.log(fib.next().value); // 输出: 1
    

ES6 中的 Iterator 接口和 for of 循环提供了更简洁、更强大的遍历方式。Iterator 接口允许我们遍历对象元素,而 for of 循环则使用 Iterator 接口来遍历数据结构。Iterator 接口和 for of 循环在许多场景中都有应用,包括遍历数组、字符串、Set、Map 和对象。