作用:
1、为各种数据结构,提供一个统一的、简便的访问接口。
2、使得数据结构的成员能够按照某种次序排列
3、ES6创造了一种新的遍历命令for...of..循环,Iterator接口主要供for...of...消费
遍历历程
1、创建一个zhu指针对象、指向当前数据结构的起始位置
2、第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。
3、第二次调用指针对象的next方法,指针就在回想数据结构的第二个成员
4、不断调用指针对象的next方法,直到它指向数据结构的结束位置
每次调用next方法,都会返回数据结构的当前成员的信息。具体地说,就是返回一个包含value和done两个属性的对象。其中value属性是当前成员的值,done属性是布尔值,表示遍历是否结构
js模拟next方法
function makeIterator(array){
var index=0;
return {
next(){
return index
默认的Iterator接口
es6规定:默认的Iterator接口部署在数据结构的Symbol.iterator属性,也就是说一个数据结构只要具有Symbol.iterator属性,就可以认为是‘可遍历的’(iterable)。Symbol.iterator本身是个函数,就是当前数据结构默认的遍历器生成函数。执行这个函数就会获取一个遍历器。而属性名Symbol.iterator只是一个表达式。
原生具备Iterator接口的数据结构:Array、Map、Set、String、TypedArray、函数的arguments对象、NodeList对象
调用Iterator接口的场合
1、结构赋值
2、扩展运算符
3、yield*
字符串的Iterator接口
如果想覆盖字符串的原生的Iterator接口,必须是通过New String()方法生成的字符串
遍历器的return方法和throw方法
遍历器对象除了具有next方法,还可以具有return方法和throw方法。
return方法的使用场合是,如果for...of循环提前退出(通常是因为出错,或者有break语句),就会调用return方法。如果一个对象在完成遍历前,需要清理或释放资源,就可以部署return方法。
数组
var arr=['a','b','c','d']
//for...in 循环 获取 索引
for(let index in arr){
console.log(index) // 0 1 2 3
}
//for..of 循环 获取 元素
for(let value of arr){
console.log(value) // 'a' 'b' 'c' 'd'
}
set
var set=new Set([...[2,3,4]])
for(let value of set){
console.log(value) //2 3 4
}
map
var map=new Map([['name1','name1'],['name2','name2']]);
for(let key of map){
console.log(key) // ['name1','name1'] ['name2','name2']
}
for(let [key,value] of map){
console.log(key+':'+value) // name1:name1 name2:name2
}
ES6 的数组、Set、Map 都部署了以下三个方法,调用后都返回遍历器对象。
entries() 返回一个遍历器对象,用来遍历[键名, 键值]组成的数组。对于数组,键名就是索引值;对于 Set,键名与键值相同。Map 结构的 Iterator 接口,默认就是调用entries方法。
keys() 返回一个遍历器对象,用来遍历所有的键名。
values() 返回一个遍历器对象,用来遍历所有的键值