ES6中的迭代器和生成器

迭代器

所有迭代器对象都有一个next()方法,每次调用都返回一个结果对象。结果对象有两个属性:一个是value,表示下一个将要返回的值;另一个是done,它是一个布尔类型的值,当没有更多可返回数据时返回true

ES5中模拟一个迭代器

function createIterator(items) {
	var i = 0;
	return {
		next: function() {
			var done = (i >= items.length);
			var value = !done ? items[i++] : underfined;

			return {
				done: done,
				value: value
			};
		}
	};
}

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: true}
console.log(iterator.next); // {value: underfined, done: true}

生成器

  • 生成器是一种返回迭代器的函数,通过 function 关键字后的星号(*)来表示,函数中会用到新的关键字yield
  • yield 关键字是ES6的新特性,可以通过它来指定调用迭代器的next()方法时的返回值及返回顺序。每当执行完一条yield语句后函数就会自动停止执行,直到再次调用迭代器的next()方法才会继续执行下一个yield
  • 使用yield关键字可以返回任何值或表达式
function* createIterator(items) {
    for (let i = 0; i < items.length; i++) {
        yield items[i];
    }
}

// 生成器的调用方式与普通函数相同,只不过返回的是一个迭代器。
let 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: undefined, done: true }

!!!注意:yield关键字只可在生成器内部使用,在其他地方使用会导致程序抛出语法错误。如:

function* createIterator(items) {
	items.forEach(function(item) {
		// 语法错误
		yield item + 1;
	})
}

可迭代对象(扩展)

可迭代对象具有Symbol.iterator属性,是一种与迭代器密切相关的对象。Symbol.iterator通过指定的函数可以返回一个作用于附属对象的迭代器。

由于生成器默认会为Symbol.iterator属性赋值,因此所有通过生成器创建的迭代器都是可迭代对象。在ES6中所有集合对象、字符串都是可迭代对象

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属性添加一个生成器,则可以将其变为可迭代对象

let collection = {
    items: [],
    * [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);
}

// 1
// 2
// 3

内建迭代器(扩展)

在ES6中对集合对象都内建了三种迭代器(数组、Set、Map)。

  • entries() 返回一个迭代器,其值为多个键值对。
  • values() 返回一个迭代器,其值为集合的值。
  • keys() 返回一个迭代器,其值为集合中的所有键名。

在for-of循环中,数组和Set默认是values(),Map默认是entries()

let colors = ['red', 'green', 'blue'];
for (let entry of colors.entries()) {
    console.log(entry);
    // [ 0, 'red' ] [ 1, 'green' ] [ 2, 'blue' ]
}

// 其余的就不一一举例了,有兴趣的自行体验

给迭代器传递参数(扩展)

如果给迭代器的next() 方法传递参数,则这个参数的值就会代替生成器内部上一条yield语句的返回值

第一次调用next() 方法前不会执行任何yield语句,因此在第一次调用next()方法时传递参数是毫无意义的。

function* createIterator() {
    let first = yield 1;
    let second = yield first + 2; // 4+2
    yield second + 3; // 5+3
}

let iterator = createIterator();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next(4)); // { value: 6, done: false }
console.log(iterator.next(5)); // { value: 8, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值