es6 Iterator 和 for...of 循环
什么是Iterator接口
- ES6中内置了一些Symbol,其中最重要的一个恐怕就是Symbol.iterator了,相当于迭代器的接口,只有对象里有这个symbol的属性,才可以认为此对象是可迭代的。
- 我们先看一下规范中对这个symbol的描述:
A method that returns the default Iterator for an object. Called by the semantics of the for-of statement. - js中哪些对象里实现了这个接口呢?常见的有Array,String,arguments,还有后面高级的数据结构,如Set,Map等。
Iterator的基本用法
for...of
- for...of循环的过程,其实就是通过不断调用Iterator接口来达到这种形式;
- 也就是说,不同的数据结构,通过for...of这种统一的形式,来达到读取不同数据结构的目标;但是背后的Iterator接口其实不同;
数组自动帮我们带了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);
}
网友评论