Iterator接口的目的就是为所有数据结构提供一种统一访问的机制,用for...of实现。
一个数据结构只要有Symbol.iterator属性,就可以认为是“可遍历的”
原型部署了Iterator接口的数据结构有三种,具体包含四种,分别是数组,类似数组的对象,Set和Map结构。
为什么对象(Object)没有部署Iterator接口呢?
有两个原因:一是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。然而遍历遍历器是一种线性处理,对于非线性的数据结构,部署遍历器接口,就等于要部署一种线性转换。二是对对象部署Iterator接口并不是很必要,因为Map弥补了它的缺陷,又正好有Iteraotr接口。
然后就会有人问了,既然有Map了,为什么还要尝试给对象部署Iterator接口呢?
答案很多啊,指不定哪天面试官就问了呢?指不定哪天你脑抽想用for...of来遍历对象了呢?又或者是遇到死板的不愿意兼容ES6规则的那个啥呢?就四这么任性!
//创建一个构造函数
function Obj(value){
this.value=value;
this.nnext=null;
}
Obj.prototype[Symbol.iterator]=function(){
var iterator={next:next};
var current=this;
function next(){
if(current){
var value=current.value;
var done=current.next===null;
current=current.next;
return {
value:value,
done:done
};
}else{
return {done:true};
}
}
return iterator;
}
测试:
![](https://img-blog.csdn.net/20180328100536231?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxOTQ5NTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
这里需要说明的是,上面例子中的对象完整表示为{one:1,teo:2,three:3}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)