es6中许多内置类型都实现了iterable接口,例如字符串、数组、映射(map)、集合(set)、arguments对象等。
实现了iterable接口必须使用Symbol.iterator作为键,引用一个默认迭代器工厂函数,调用这个迭代器工厂函数返回一个迭代器。
也就是说当迭代一个可迭代对象时的顺序是:
- 调用对象默认的迭代器工厂函数,返回一个迭代器。
- 使用返回的迭代器的next()方法按照顺序依次返回值(数组的顺序是下标,set跟map的顺序是元素插入顺序。)
set没有键只有值,所以set实际上只有两种种迭代器工厂函数values()以及entries(),而entries()返回的迭代器会按照顺序产生包含两个元素的数组,这两个元素的值是一样的,即set中的元素即当key也当value。
let a = new Set(['a','b','c']);
console.log(a[Symbol.iterator] === a.keys === a.values) // true\
数组跟map其实都是键值对的形式,它们有三种迭代器工厂函数分别是:
- keys() //返回键
- values() //返回值
- entries() //返回键值对