迭代器是ES6的一个重要组成部分,在ES6中,已经默认为许多内建类型提供了内建迭代器,只有当这些内建迭代器无法实现目标时才需要自己创建。通常来说当定义自己的对象和类时才会遇到这种情况,否则,完全可以依靠内建的迭代器完成工作,而最常使用的可能是集合的那些迭代器
【集合对象迭代器】
在ES6中有3种类型的集合对象:数组、Map集合与Set集合
为了更好地访问对象中的内容,这3种对象都内建了以下三种迭代器
entries() 返回一个迭代器,其值为多个键值对
values() 返回一个迭代器,其值为集合的值
keys() 返回一个迭代器,其值为集合中的所有键名
调用以上3个方法都可以访问集合的迭代器
entries()迭代器
每次调用next()方法时,entries()迭代器都会返回一个数组,数组中的两个元素分别表示集合中每个元素的键与值。如果被遍历的对象是数组,则第一个元素是数字类型的索引;如果是Set集合,则第一个元素与第二个元素都是值(Set集合中的值被同时作为键与值使用);如果是Map集合,则第一个元素为键名
let colors = [ "red", "green", "blue" ]; let tracking = new Set([1234, 5678, 9012]); let data = new Map(); data.set("title", "Understanding ES6"); data.set("format", "ebook"); for (let entry of colors.entries()) { console.log(entry); } for (let entry of tracking.entries()) { console.log(entry); } for (let entry of data.entries()) { console.log(entry); }
调用console.log()方法后输出以下内容
[0, "red"] [1, "green"] [2, "blue"] [1234, 1234] [5678, 5678] [9012, 9012] ["title", "Understanding ES6"] ["format", "ebook"]
在这段代码中,调用每个集合的entries()方法获取一个迭代器,并使用for-of循环来遍历元素,且通过console将每一个对象的键值对输出出来
values()迭代器
调用values()迭代器时会返回集合中所存的所有值
let colors = [ "red", "green", "blue" ]; let tracking = new Set([1234, 5678, 9012]); let data = new Map(); data.set("title", "Understanding ES6"); data.set("format", "ebook"); for (let value of colors.values()) { console.log(value); } for (let value of tracking.values()) { console.log(value); } for (let value of data.values()) { console.log(value); }
调用console.log()方法后输出以下内容
"red" "green" "blue" 1234 5678 9012 "Understanding ES6" "ebook"
如上所示,调用values()迭代器后,返回的是每个集合中包含的真正数据,而不包含数据在集合中的位置信息
keys()迭代器
keys()迭代器会返回集合中存在的每一个键。如果遍历的是数组,则会返回数字类型的键,数组本身的其他属性不会被返回;如果是Set集合,由于键与值是相同的,因此keys()和values()返回的也是相同的迭代器;如果是Map集合,则keys()迭代器会返回每个独立的键
let colors = [ "red", "green", "blue" ]; let tracking = new Set([1234, 5678, 9012]); let data = new Map(); data.set("title", "Understanding ES6"); data.set("format", "ebook"); for (let key of colors.keys()) { console.log(key); } for (let key of tracking.keys()) { console.log(key); } for (let key of data.keys()) { console.log(key); }
调用console.log()方法后输出以下内容
0 1 2 1234 5678 9012 "title" "format"
keys()迭代器会获取colors、tracking和data这3个集合中的每一个键,而且分别在3个for-of循环内部将这些键名打印出来。对于数组对象来说,无论是否为数组添加命名属性,打印出来的都是数字类型的索引;而for-in循环迭代的是数组属性而不是数字类型的索引
不同集合类型的默认迭代器
每个集合类型都有一个默认的迭代器,在for-of循环中,如果没有显式指定则使用默认的迭代器。数组和Set集合的默认迭代器是values()方法,Map集合的默认迭代器是entries()方法。有了这些默认的迭代器,可以更轻松地在for-of循环中使用集合对象
let colors = [ "red", "green", "blue" ]; let tracking = new Set([1234, 5678, 9012]); let data = new Map(); data.set("title", "Understanding ES6"); 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); }
上述代码未指定迭代器,所以将使用默认的迭代器。数组、Set集合及Map集合的默认迭代器也会反应出这些对象的初始化过程,所以这段代码会输出以下内容
"red" "green" "blue" 1234 5678 9012 ["title", "Understanding ES6"] ["format", "print"]