JavaScript ES6迭代器指南

惰性执行

迭代器允许我们在第一次调用next()函数之后,再执行相应的逻辑。在上面的例子里,当我们调用迭代器的瞬间,我们就立刻执行了排序和取值的工作。但是,如果next()函数永远不被调用的话,我们就浪费了性能。所以让我们来优化它:

 1 table[Symbol.iterator] = function () {
 2   var _this = this;
 3   var keys = null;
 4   var index = 0;
 5
 6   return {
 7     next: function () {
 8       if (keys === null) {
 9         keys = Object.keys(_this).sort();
10       }
11
12       return {
13         value: keys[index], done: index++ >= keys.length
14       };
15     }
16   }
17 }

for-offor-in的差别

理解for-offor-in之间的差别,是十分重要的。以下是一个简单的,但是非常好的解释差别的例子:

 1 var list = [3, 5, 7];
 2 list.foo = ‘bar‘;
 3
 4 for (var key in list) {
 5   console.log(key); // 0, 1, 2, foo
 6 }
 7
 8 for (var value of list) {
 9   console.log(value); // 3, 5, 7
10 }

正如所见的,for-of循环仅打印出了数组中的值,忽略了其他属性。这是因为数组的迭代器只返回其中预期的元素。

内置迭代器

StringArrayTypedArrayMapSet都是内置迭代器,因为它们的原型中都有一个Symbol.iterator方法。

1 var string = "hello";
2
3 for (var chr of string) {
4   console.log(chr); // h, e, l, l, o
5 }

解构赋值

解构操作同样也接受一个迭代器:

1 var hello = ‘world‘;
2 var [first, second, ...rest] = [...hello];
3 console.log(first, second, rest); // w o ["r","l","d"]

无限迭代器

只要永远不返回done: true,就实现了一个无限迭代器。当然,需要极力避免出现这种情况。

 1 var ids = {
 2   *[Symbol.iterator]: function () {
 3     var index = 0;
 4
 5     return {
 6       next: function () {
 7         return { value: ‘id-‘ + index++, done: false };
 8       }
 9     };
10   }
11 };
12
13 var counter = 0;
14
15 for (var value of ids) {
16   console.log(value);
17
18   if (counter++ > 1000) { // let‘s make sure we get out!
19     break;
20   }
21 }

Generator函数

如果你还不了解ES6 generator 函数,请参考MDN文档。简而言之,generator函数是当前被谈论最多的ES6特性,它是一个可以暂时退出,并且稍后重新进入继续执行的函数。在多次的进入中,它的上下文(绑定的变量)是会被保存的。generator函数自身就是一个迭代器,来看下面的例子:

 1 function* list(value) {
 2   for (var item of value) {
 3     yield item;
 4   }
 5 }
 6
 7 for (var value of list([1, 2, 3])) {
 8   console.log(value);
 9 }
10
11 var iterator = list([1, 2, 3]);
12
13 console.log(typeof iterator.next); // function
14 console.log(typeof iterator[Symbol.iterator]); // function
15
16 console.log(iterator.next().value); // 1
17
18 for (var value of iterator) {
19   console.log(value); // 2, 3
20 }

所以,我们可以使用generator函数重写我们上面的迭代器:

1 table[Symbol.iterator] = function* () {
2   var keys = Object.keys(this).sort();
3
4   for (var item of keys) {
5     yield item;
6   }
7 }

最后

迭代器给JavaScript中的循环,generator函数和值序列(value series)带来了一个新的维度。你可以使用它,定义一个类中,它的值的排序方式,也可以用通过其来创建一个惰性的或无限的序列,等等。

原文地址

https://strongloop.com/strongblog/introduction-to-es6-iterators/

译文地址:

http://segmentfault.com/a/1190000003021261

时间: 2024-10-10 18:02:08

JavaScript ES6迭代器指南的相关文章

javascript立体学习指南

javascript立体学习指南第一章:首先了解javascript 首先,什么是javascript? JavaStrip出生于1995年,是一种文本脚本语言,成都装修公司是一种动态的.弱类型的.基于原型的语言.当然,它与Java无关,比如雷峰塔和雷锋.显然,这并不重要.JavaScript的原始名称是LiveScript,它处理了以前由服务器端语言(如Perl)执行的一些输入验证操作.在发布前夕,Netscape临时改名为LiveScript javascript,以抓住媒体炒作的机会.19

javascript小白学习指南0---1

引言: 做为一名程序员,都是真心的想把自己的东西分享出来,供大家一起学习探讨,一起提高技能,一起涨工资,呵 这一系列的文章都是关于Javascript 基础的 当然文章当中穿插了些我自己的理解,希望可以帮助一些刚开始的童鞋! 废话不多说我们开始吧! 第一章:Javascript 基本概念 主要内容 数据类型 控制语句 函数 我们先从最简单的数据类型开始吧! 首先请记住javascript 有5种基本数据类型和1种复杂数据类型,至于为什么只有这六种,大家可以去翻翻W3C的资料哈! 五种基本数据类型

JavaScript es6 class类的理解。

在本篇文章我将会把我对JavaScript  es6新特性class类的理解.本着互联网的分享精神,我就将我自己的理解分享给大家. 使用es写一个类(构造函数) 在es5中大家一般都这么写一个类(构造函数) 另外需要注意,class类不会被提升. // 创建一个User构造函数 function User(name, age) { this.name = name; this.age = age; } // User构造函数的静态方法. User.getClassName = function

JavaScript ES6中export及export default的区别

相信很多人都使用过export.export default.import,然而它们到底有什么区别呢? 在JavaScript ES6中,export与export default均可用于导出常量.函数.文件.模块等,你可以在其它文件或模块中通过import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便能够对其进行使用,但在一个文件或模块中,export.import可以有多个,export default仅有一个. 具体使用: 1. //demo1.js export con

JavaScript 编码风格指南

A.1  缩进 // 4个空格的层级缩进 if (true) { doSomething(); } A.2  行的长度 // 每行限于80个字符,超出则在运算符后换行,缩进2个层级(8个空格) doSomething(argument1, argument2, argument3, argument4, argument5); A.3  原始值 // 字符串使用双引号及长字符串的链接 var name = "Nicholas", longStr = "this is a lo

javascript小白学习指南0---2

好啦 好啦 ,美女看够了,我们开始继续上一次讲的内容把(上一节的内容) 控制语句: 首先我先给大家总结一下在javascript中一共有 9 种控制语句它们分别是 if 语句 do-while 语句 while 语句 for 语句 for-in 语句 label 语句 break 和 continue 语句 with 语句 switch 语句 下面来分别为这几个控制语句举个例子 var i=10; if(i>15) { alert("i>15") } else if(i&l

javascript小白学习指南1---0

第二章 变量和作用域 在看第二章时我希望,你可以回顾一下前一次所讲的内容  如果有所遗忘 点这里 今天我们来说说 变量和作用域的问题 本章主要内容 基本类型和引用类型 执行环境 垃圾回收(了解即可) 基本类型和引用类型 JS中可能包含两种不同的数据类型的值:  基本类型  和 引用类型    基本类型值 指的是简单的数据段   而 引用类型指那些可能由多个值构成的对象. 如何定义基本类型值和引用类型值呢?  看下面 创建一个变量并给它赋值就OK了. 对于引用类型我们可以添加 和删除它的属性和方法

【读书札记】《JavaScript DOM编程指南》

对于Javascript的认识是来自于2011年夏天去实训基地做的一个网页项目,当时认为JavaScript是不是Java的一个派别语言什么的,老师那时候教我们调用了一些Javascript的方法.当时对这个语言的最初的印象就是会调用方法大致能懂就行了,没有深究.直到今年年初去面试几家企业,问我会不会使用Javascript,我说就调调几个方法就好了~   当时瞬间就直到无地自容了.于是将这本JavaScript的电子书看了下,写下相关的读书札记,也希望能让和我有着对Javascript误解的人

Javascript ES6 特性概述(即ECMAScript 6和ES2015+)

Javascript在过去的一年里变化了很多,从现在开始,有12个新的特性可以开始用了! 1. 历史 ECMAScript 6是对Javascript语言的增强,有时候也被称为ES6或者ES2015+. Javascript诞生在1995年,从那以后一直在缓慢地演变,每隔几年会有一些新的增强特性出现.ECMAScript出现在1997年,目的是指导Javascript的演化路径,它已经发布了好几个版本,如ES3.ES5.ES6,等等. 可以看到,在ES3.ES5和ES6之间分别有10年和6年的空