迭代器和生成器

简介: 在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}
相关文章
|
监控 安全 BI
组态软件的功能需求分析
组态软件的功能需求分析
|
12月前
|
数据可视化 数据库
通义灵码个人版新功能最佳实践测评
作为一名软件开发工程师,我使用通义灵码个人版的@workspace和@terminal功能,快速熟悉新的电商项目代码并实现新功能,效率提升了约30%。通过自动识别项目结构、代码分析、智能注释和自动补全等功能,大幅减少了查找资料和调试的时间,使开发流程更加顺畅,专注于业务逻辑实现。
267 1
Axios 通过a标签下载文件 跨域下载
Axios 通过a标签下载文件 跨域下载
Axios 通过a标签下载文件 跨域下载
|
人工智能 持续交付 Docker
探索现代软件开发的五大趋势
在快速变化的技术领域,软件开发正经历前所未有的变革。本文探讨了塑造未来技术景观的五大趋势:微服务架构的兴起,让应用更模块化;容器化与Docker简化部署;CI/CD提升软件交付速度;低代码/无代码平台降低开发门槛;AI与ML自动化测试和代码生成。掌握这些趋势将帮助开发者保持竞争力。
|
Ubuntu Linux
内核实验(八):实现O-NONBLOCK非阻塞读写
本文通过修改之前的内核模块代码,介绍了如何在Linux内核中实现O_NONBLOCK非阻塞读写机制,并通过在Qemu虚拟机上的测试验证了非阻塞读写操作的正确性。
169 0
内核实验(八):实现O-NONBLOCK非阻塞读写
|
存储 JSON OLAP
Hologres支持哪些数据格式?
【8月更文挑战第20天】Hologres支持哪些数据格式?
361 1
在Linux中,如何进行备份或归档文件(tar 命令)?
在Linux中,如何进行备份或归档文件(tar 命令)?
|
Kubernetes IDE Serverless
Serverless 应用引擎操作报错合集之在阿里函数计算中,SD Controlnet Depth 运行过程中出现错误“urllib3 v2.0 only supports OpenSSL 1.1.1+”如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
519 3
|
存储 移动开发 测试技术
苹果个人付费开发者证书申请及使用图文详解
上篇文章《iOS真机安装WebDriverAgent图文详解》中提到如果使用付费版开发者证书去编译安装WDA,那么就不需要在手机上点击信任,这样更方便自动化测试的执行,今天就给大家详细分享一下如何申请个人付费开发者证书以及如何使用。
2928 0
苹果个人付费开发者证书申请及使用图文详解
|
关系型数据库 MySQL 测试技术
sysbench安装、使用、结果解读
数据库,mysql,基准测试