返回顶部
首页 > 资讯 > 前端开发 > VUE >ES6中迭代器与生成器的示例分析
  • 114
分享到

ES6中迭代器与生成器的示例分析

2024-04-02 19:04:59 114人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关es6中迭代器与生成器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:循环语句的问题var colors 

这篇文章将为大家详细讲解有关es6中迭代器与生成器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

具体如下:

循环语句的问题

var colors = ["red", "green", "blue"];
for(var i=0; i<colors.length; i++){
  console.log(colors[i]);
}

在ES6之前,这种标准的for循环,通过变量来跟踪数组索引。如果多个循环嵌套就需要追踪多个变量,代码复杂度会大大增加,也容易产生错用循环变量的bug。

迭代器的出现旨在消除这种复杂性并减少循环中的错误。

什么是迭代器

我们先感受一下用ES5语法模拟创建一个迭代器:

function createIterator(items) {
  var i = 0;
  
  return { // 返回一个迭代器对象
    next: function() { // 迭代器对象一定有个next()方法
      var done = (i >= items.length);
      var value = !done ? items[i++] : undefined;
      
      return { // next()方法返回结果对象
        value: value,
        done: done
      };
    }
  };
}

var iterator = createIterator([1, 2, 3]);

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: undefiend, done: true}"
// 之后所有的调用都会返回相同内容
console.log(iterator.next()); // "{ value: undefiend, done: true}"

以上,我们通过调用createIterator()函数,返回一个对象,这个对象存在一个next()方法,当next()方法被调用时,返回格式{ value: 1, done: false}的结果对象。

因此,我们可以这么定义:迭代器是一个拥有next()方法的特殊对象,每次调用next()都返回一个结果对象。

借助这个迭代器对象,我们来改造刚开始那个标准的for循环【暂时先忘记ES6的for-of循环新特性】:

var colors = ["red", "green", "blue"];
var iterator = createIterator(colors);
while(!iterator.next().done){
  console.log(iterator.next().value);
}

what?,消除循环变量而已,需要搞这么麻烦,代码上不是得不偿失了吗?

并非如此,毕竟createIterator()只需写一次,就可以一直复用。不过ES6引入了生成器对象,可以让创建迭代器的过程变得更加简单。

什么是生成器

生成器是一种返回迭代器的函数,通过function关键字后的星号(*)来表示,函数中会用到新的关键字yield。

function *createIterator(items) {
  for(let i=0; i<items.length; i++) {
    yield items[i];
  }
}

let iterator = createIterator([1, 2, 3]);

// 既然生成器返回的是迭代器,自然就可以调用迭代器的next()方法
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: undefiend, done: true}"
// 之后所有的调用都会返回相同内容
console.log(iterator.next()); // "{ value: undefiend, done: true}"

上面,我们用ES6的生成,大大简化了迭代器的创建过程。我们给生成器函数createIterator()传入一个items数组,函数内部,for循环不断从数组中生成新的元素放入迭代器中,每遇到一个yield语句循环都会停止;每次调用迭代器的next()方法,循环便继续运行并停止在下一条yield语句处。

生成器的创建方式

生成器是个函数:

function *createIterator(items) { ... }

可以用函数表达式方式书写:

let createIterator = function *(item) { ... }

也可以添加到对象中,ES5风格对象字面量:

let o = {
  createIterator: function *(items) { ... }
};

let iterator = o.createIterator([1, 2, 3]);

ES6风格的对象方法简写方式:

let o = {
  *createIterator(items) { ... }
};

let iterator = o.createIterator([1, 2, 3]);

可迭代对象

在ES6中,所有的集合对象(数组、Set集合及Map集合)和字符串都是可迭代对象,可迭代对象都绑定了默认的迭代器。

来了来了,姗姗来迟的ES6循环新特性for-of:

var colors = ["red", "green", "blue"];
for(let color of colors){
  console.log(color);
}

for-of循环,可作用在可迭代对象上,正是利用了可迭代对象上的默认迭代器。大致过程是:for-of循环每执行一次都会调用可迭代对象的next()方法,并将迭代器返回的结果对象的value属性存储在变量中,循环将继续执行这一过程直到返回对象的done属性的值为true。

如果只需要迭代数组或集合中的值,用for-of循环代替for循环是个不错的选择。

访问默认迭代器

可迭代对象,都有一个Symbol.iterator方法,for-of循环时,通过调用colors数组的Symbol.iterator方法来获取默认迭代器的,这一过程是在javascript引擎背后完成的。

我们可以主动获取一下这个默认迭代器来感受一下:

let values = [1, 2, 3];
let iterator = values[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}"

在这段代码中,通过Symbol.iterator获取了数组values的默认迭代器,并用它遍历数组中的元素。在JavaScript引擎中执行for-of循环语句也是类似的处理过程。

用Symbol.iterator属性来检测对象是否为可迭代对象:

function isIterator(object) {
  return typeof object[Symbol.iterator] === "function";
}

console.log(isIterable([1, 2, 3])); // true
console.log(isIterable(new Set())); // true
console.log(isIterable(new Map())); // true
console.log(isIterable("Hello")); // true

创建可迭代对象

当我们在创建对象时,给Symbol.iterator属性添加一个生成器,则可以将其变成可迭代对象:

let collection = {
  items: [],
  *[Symbol.iterator]() { // 将生成器赋值给对象的Symbol.iterator属性来创建默认的迭代器
    for(let item of this.items) {
      yield item;
    }
  }
};

collection.items.push(1);
collection.items.push(2);
collection.items.push(3);

for(let x of collection) {
  console.log(x);
}

内建迭代器

ES6中的集合对象,数组、Set集合和Map集合,都内建了三种迭代器:

  • entries() 返回一个迭代器,其值为多个键值对。如果是数组,第一个元素是索引位置;如果是Set集合,第一个元素与第二个元素一样,都是值。

  • values() 返回一个迭代器,其值为集合的值。

  • keys() 返回一个迭代器,其值为集合中的所有键名。如果是数组,返回的是索引;如果是Set集合,返回的是值(Set的值被同时用作键和值)。

不同集合的默认迭代器

每个集合类型都有一个默认的迭代器,在for-of循环中,如果没有显式指定则使用默认的迭代器。按常规使用习惯,我们很容易猜到,数组和Set集合的默认迭代器是values(),Map集合的默认迭代器是entries()。

请看以下示例:

let colors = [ "red", "green", "blue"];
let tracking = new Set([1234, 5678, 9012]);
let data = new Map();

data.set("title", "Understanding ECMAScript 6");
data.set("fORMat", "print");

// 与调用colors.values()方法相同
for(let value of colors) {
  console.log(value);
}

// 与调用tracking.values()方法相同
for(let num of tracking) {
  console.log(num);
}

// 与调用data.entries()方法相同
for(let entry of data) {
  console.log(entry);
}

这段代码会输入以下内容:

"red"
"green"
"blue"
1234
5678
9012
["title", "Understanding ECMAScript 6"]
["format", "print"]

for-of循环配合解构特性,操纵数据会更方便:

for(let [key, value] of data) {
  console.log(key + "=" + value);
}

展开运算符操纵可迭代对象

let set = new Set([1, 2, 3, 4, 5]),
  array = [...set];
  
console.log(array); // [1,2,3,4,5]

展开运算符可以操作所有的可迭代对象,并根据默认迭代器来选取要引用的值,从迭代器读取所有值。然后按返回顺序将它们依次插入到数组中。因此如果想将可迭代对象转换为数组,用展开运算符是最简单的方法。

关于“ES6中迭代器与生成器的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: ES6中迭代器与生成器的示例分析

本文链接: https://lsjlt.com/news/75913.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ES6中迭代器与生成器的示例分析
    这篇文章将为大家详细讲解有关ES6中迭代器与生成器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:循环语句的问题var colors ...
    99+
    2024-04-02
  • Python中切片迭代列表生成式及生成器的示例分析
    小编给大家分享一下Python中切片迭代列表生成式及生成器的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在Python中,代码越少越好、越简单越好。基于这一思想,需要掌握Python中非常有用的高级特性,1行代码...
    99+
    2023-06-25
  • 详解ES6 中的迭代器和生成器
    目录1.迭代器2.生成器1.迭代器 Iterator是 ES6 引入的一种新的遍历机制。两个核心 迭代器是一个统一的接口,它的作用是使各种数据结构可以被便捷的访问,它是通过一个键为S...
    99+
    2022-11-13
    ES6 中的迭代器和生成器 ES6 迭代器 ES6生成器
  • ​​​​​​​python可迭代对象,迭代器,生成器,协程实例分析
    这篇文章主要介绍了python可迭代对象,迭代器,生成器,协程实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python可迭代对象,迭代器,生成器,协程实例分析文章都会有所收获,下面我们一起来看看吧。设...
    99+
    2023-06-30
  • 迭代器与生成器
    这一部分待加强!                (一)迭代器    一:简介    迭代是Python最强大的功能之一,是访问集合元素的一种方式。    迭代器是一个可以记住遍历的位置的对象。    迭代器对象从集合的第一个元素开始访问,...
    99+
    2023-01-30
    生成器 迭代
  • ES6语法之可迭代协议和迭代器协议的示例分析
    这篇文章给大家分享的是有关ES6语法之可迭代协议和迭代器协议的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ECMAScript 2015的几个补充,并不是新的内置或语法...
    99+
    2024-04-02
  • Python 中迭代器与生成器实例详解
    Python 中迭代器与生成器实例详解 本文通过针对不同应用场景及其解决方案的方式,总结了Python中迭代器与生成器的一些相关知识,具体如下: 1.手动遍历迭代器 应用场景:想遍历一个可迭代对象中的所...
    99+
    2022-06-04
    生成器 详解 实例
  • Python迭代器与生成器
    生成器仅仅拥有生成某种东西的能力,如果不用__next__方法是获取不到值得。创建一个生成器函数>>> def scq(): ...    print("11") # 当函数代码块中遇到yield关键字的时候,这个函数就是...
    99+
    2023-01-31
    生成器 迭代 Python
  • Python3 迭代器与生成器
    Edit笔记内容:Python3 迭代器与生成器 笔记日期:2017-10-28迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元...
    99+
    2023-01-31
    生成器 迭代
  • JavaScript中的迭代器和可迭代对象与生成器
    目录1. 什么是迭代器?1.1 迭代器的基本实现1.2 迭代器的封装实现2. 什么是可迭代对象2.1 原生可迭代对象(JS内置)2.1.1 部分for of 演示2.1.2 查看内置...
    99+
    2024-04-02
  • Nhibernate与代码生成的示例分析
    这篇文章主要为大家展示了“Nhibernate与代码生成的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Nhibernate与代码生成的示例分析”这篇文章吧。在向大家详细介绍Nhiber...
    99+
    2023-06-17
  • Python 迭代器与生成器实例详解
    Python 迭代器与生成器实例详解 一、如何实现可迭代对象和迭代器对象 1.由可迭代对象得到迭代器对象 例如l就是可迭代对象,iter(l)是迭代器对象 In [1]: l = [1,2,3,4] ...
    99+
    2022-06-04
    生成器 详解 实例
  • Python中迭代器与生成器的用法
    一、迭代器(foreach) 1、可迭代的对象 内置有__iter__方法的都叫可迭代的对象。 Python内置str、list、tuple、dict、set、file都是可迭代对象...
    99+
    2024-04-02
  • Python中的迭代器与生成器高级用法解析
    迭代器 迭代器是依附于迭代协议的对象——基本意味它有一个next方法(method),当调用时,返回序列中的下一个项目。当无项目可返回时,引发(raise)StopIteration异常。 迭代对象允许一次...
    99+
    2022-06-04
    生成器 高级 迭代
  • Mybatis-Plus代码生成器的示例分析
    小编给大家分享一下Mybatis-Plus代码生成器的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 实战 数据库脚本 创建一张商品表test_goodsCREATE&nbs...
    99+
    2024-04-02
  • 举例讲解Python中的迭代器、生成器与列表解析用法
    迭代器:初探 上一章曾经提到过,其实for循环是可用于任何可迭代的对象上的。实际上,对Python中所有会从左至右扫描对象的迭代工具而言都是如此,这些迭代工具包括了for循环、列表解析、in成员关系测试以及...
    99+
    2022-06-04
    生成器 迭代 列表
  • 解析Python中的生成器及其与迭代器的差异
    生成器 生成器是一种迭代器,是一种特殊的函数,使用yield操作将函数构造成迭代器。普通的函数有一个入口,有一个返回值;当函数被调用时,从入口开始执行,结束时返回相应的返回值。生成器定义的函数,有多个入口和...
    99+
    2022-06-04
    生成器 差异 迭代
  • python迭代器与生成器详解
    例子 老规矩,先上一个代码: def add(s, x): return s + x def gen(): for i in range(4): yield i base = gen() ...
    99+
    2022-06-04
    生成器 详解 迭代
  • python迭代器与生成器小结
    2016.3.10关于例子解释的补充更新 源自我的博客 例子 老规矩,先上一个代码: def add(s, x): return s + x def gen(): for i in range(4): ...
    99+
    2023-01-31
    生成器 小结 迭代
  • python基础:迭代器与生成器
    一、迭代器 迭代器只能向前访问,不能后退字典,列表,元组,字符串,range都是可以迭代的对象。 1、创建迭代器 `dict={1:3,2:4,3:5,4:6}key = iter(dict)print(key)print(next(key...
    99+
    2023-01-31
    生成器 迭代 基础
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作