const a = 1;
const c = {};
console.log(a[Symbol.iterator]); //undefined
consolt.log(c[Symbol.iterator]); //undefined
const str = 'abc';
const arr = ['a','b','c'];
const map = new Map().set('a',1).set('b',2).set('c',3);
const set = new Set().add('a',1).add('b',2).add('c',3);
const els = document.querySelectAll('div');
console.log(str[Symbol.iterator],str[Symbol.iterator]());
// f values() { [native code] },StringIterator {}
...
迭代方法
for-of
数组结构
扩展操作符 [...arr]
Array.from (arr)
Set构造函数 let set = new Set(arr)
Map沟道函数 let map = new Map(arr)
如果对象父类实现了迭代器方法,那这个对象也会有
class ChildrenArray extends Array{}
let ChildrenArr = new ChildrenArray('a','b','c');
for(let item of ChildrenArr){
console.log(item);
}
// a
// b
// c
使用next()迭代
let arr = ['a','b','c'];
let iter = arr[Symbol.iterator]();
console.log(iter.next()); // {done:false,value:'a'}
console.log(iter.next()); // {done:false,value:'b'}
console.log(iter.next()); // {done:false,value:'c'}
console.log(iter.next()); // {done:true,value:'undefined'}
自定义迭代器
class MyIterator{
constructor(value){
this.value= value;
}
[Symbol.iterator](){
let count = 1;
let limit = this.value;
return{
next(){
if(count <= limit){
return {done:false,value:count++};
}else{
return {done:true,value:undefined};
}
}
}
}
}
let iter = new MyIterator(3);
for(let i of iter){ console.log(i)}
// 1
// 2
// 3