迭代器和生成器

简介: 在JavaScript中,迭代器(`Iterator`)是一个对象,用于在可迭代的数据结构中遍历和访问每个元素,而不必暴露该数据结构的内部结构。

21. 迭代器和生成器

1. 迭代器:

在JavaScript中,迭代器(Iterator)是一个对象,用于在可迭代的数据结构中遍历和访问每个元素,而不必暴露该数据结构的内部结构。很多数据结构都实现了可迭代接口:字符串、数组、MapSetargumentsNodeListDOM集合类型,可以使用Symbol.iterator方法获取它们的迭代器对象。

迭代器对象通常实现了一个next()方法,每次调用该方法将返回一个包含两个属性的对象:valuedone。其中,value属性表示集合中下一个要返回的元素的值,done属性表示是否已经到达集合的末尾。当done属性为true时,表示已经访问完所有元素。如:

let str = "hello"
let strIter = str[Symbol.iterator]();
console.log(strIter.next());//{value: 'h', done: false}
console.log(strIter.next());//{value: 'e', done: false}
console.log(strIter.next());//{value: 'l', done: false}
console.log(strIter.next());//{value: 'l', done: false}
console.log(strIter.next());//{value: 'o', done: false}
console.log(strIter.next());//{value: undefined, done: true}

let arr = [1,2,3]
let arrIter = arr[Symbol.iterator]();
console.log(arrIter.next());//{value: '1', done: false}
console.log(arrIter.next());//{value: '2', done: false}
console.log(arrIter.next());//{value: '3', done: false}
console.log(arrIter.next());//{value: undefined, done: true}

自定义可迭代对象

// 创建一个可迭代对象
const myObj = {
   
  data: [1, 2, 3],
  [Symbol.iterator]() {
   
    let index = 0;
    return {
   
      next: () => {
   
        if (index < this.data.length) {
   
          return {
    value: this.data[index++], done: false };
        } else {
   
          return {
    value: undefined, done: true };
        }
      }
    };
  }
};

const iterator = myObj[Symbol.iterator]();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

2.生成器

在JavaScript中,生成器的形式是一个函数,函数名称前面加一个星号(*)表示它是一个生成器函数。只要可以定义函数的地方,就可以定义生成器。

// 生成器函数
function* generatorFn(){
   }

调用生成器函数会产成一个生成器对象,生成器对象也是迭代器,所以生成器对象也有next()方法,调用next方法会执行生成器函数中的代码,直到遇到yield关键字或者done状态为true

let gn = generatorFn()
console.log(gn);//generatorFn {<suspended>}
console.log(gn.next);//ƒ next() { [native code] }
console.log(gn.next());//{value: undefined, done: true}
function* generatorFn(){
   
  console.log("第一段代码~");
  yield "first end"

  console.log("第二段代码~");
  yield "second end"

  console.log("第三段代码~");
  return "123"
}
let gn = generatorFn()
console.log(gn.next());//第一段代码~ {value: 'first end', done: false}
console.log(gn.next());//第二段代码~ {value: 'second end', done: false}
console.log(gn.next());//第三段代码~ {value: '123', done: true}

next()方法可以传参数,这个参数会作为上一个yield语句的返回值

// next传值
function* compute(num){
   
  console.log(num);
  let n1 = yield num * 10
  console.log(n1);
  let n2 = yield n1 * 10
  console.log(n2);
  return n2
}
let numGn = compute(2)
console.log(numGn.next());//2  {value: 20, done: false} 
console.log(numGn.next(3));//3  {value: 30, done: false}
console.log(numGn.next(4));//4  {value: 4, done: true}
相关文章
|
5月前
|
算法 数据处理 C++
C++一分钟之-迭代器与算法
【6月更文挑战第21天】C++ STL的迭代器统一了容器元素访问,分为多种类型,如输入、输出、前向、双向和随机访问。迭代器使用时需留意失效和类型匹配。STL算法如查找、排序、复制要求特定类型的迭代器,注意容器兼容性和返回值处理。适配器和算法组合增强灵活性,但过度使用可能降低代码可读性。掌握迭代器和算法能提升编程效率和代码质量。
50 3
使用推导式和生成器创建数组
使用推导式和生成器可以便捷创建数组。例如,`[n^2 for n in 1:10]` 生成一个包含平方数的向量,而 `[n*m for n in 1:10, m in 1:10]` 创建一个乘积矩阵。无括号形式如 `n^2 for n in 1:5` 产生生成器,需要 `collect` 转换为数组。另外,表达式 `sum(1/n^2 for n=1:1000)` 求和而不占用大量内存。
|
6月前
|
算法 程序员 C语言
【C++ 迭代器实现细节 】深入探索C++迭代器:从实现到整合
【C++ 迭代器实现细节 】深入探索C++迭代器:从实现到整合
160 0
|
6月前
|
大数据 Python
Python编程中的迭代器与生成器
【2月更文挑战第7天】在Python编程中,迭代器和生成器是两个重要的概念,它们提供了一种高效的方法来处理数据集合。本文将深入探讨迭代器和生成器的定义、用法以及在实际项目中的应用,帮助读者更好地理解和运用这两个功能强大的工具。
|
存储 Python
18.从入门到精通:Python迭代器与生成器 迭代器 创建一个迭代器 StopIteration 生成器
18.从入门到精通:Python迭代器与生成器 迭代器 创建一个迭代器 StopIteration 生成器
|
Python
生成器和迭代器
生成器和迭代器
55 0
|
JavaScript 前端开发 中间件
一文彻底搞懂迭代器与生成器函数
参考mdn上解释,迭代器是一个对象,每次调用next方法返回一个{done: false, value: ''},每次调用next返回当前值,直至最后一次调用时返回 {value:undefined,done: true}时结束,无论后面调用next方法都只会返回{value: undefined,done:true}
160 0
一文彻底搞懂迭代器与生成器函数
|
JavaScript 前端开发
ES6--》了解并应用迭代器与生成器
ES6中迭代器与生成器讲解
113 0
ES6--》了解并应用迭代器与生成器