什么是Iterator接口
- ES6中內(nèi)置了一些Symbol,其中最重要的一個恐怕就是Symbol.iterator了饰豺,相當于迭代器的接口亿鲜,只有對象里有這個symbol的屬性,才可以認為此對象是可迭代的冤吨。
- 我們先看一下規(guī)范中對這個symbol的描述:
A method that returns the default Iterator for an object. Called by the semantics of the for-of statement. - js中哪些對象里實現(xiàn)了這個接口呢蒿柳?常見的有Array,String漩蟆,arguments其馏,還有后面高級的數(shù)據(jù)結(jié)構(gòu),如Set爆安,Map等叛复。
Iterator的基本用法
for...of
- for...of循環(huán)的過程,其實就是通過不斷調(diào)用Iterator接口來達到這種形式扔仓;
- 也就是說褐奥,不同的數(shù)據(jù)結(jié)構(gòu),通過for...of這種統(tǒng)一的形式翘簇,來達到讀取不同數(shù)據(jù)結(jié)構(gòu)的目標撬码;但是背后的Iterator接口其實不同;
數(shù)組自動幫我們帶了iterator接口
let arr=['hello','world'];
let map=arr[Symbol.iterator]();
console.log(map.next());
console.log(map.next());
console.log(map.next());
Object {value: "hello", done: false};done代表版保,是否做完了所有操作呜笑,true:代表是; false:代表無彻犁,還有其他操作叫胁;
Object對象不是一個iterator,那么如何把它變成一個iterator呢汞幢?
let obj={
start:[1,3,2],
end:[7,8,9],
[Symbol.iterator](){
let self=this;
let index=0;
let arr=self.start.concat(self.end);
let len=arr.length;
return {
next (){
if(index<len){
return {
value:arr[index++],
done:false
}
}else{
return {
value:arr[index++],
done:true
}
}
}
}
}
}
for(let key of obj){
console.log(key);
}
let...of的使用
let arr=['hello','world'];
for(let value of arr){
console.log(value);
}