迭代器

let x = [1, 2, 3, 4];

const [a, b, c] = x;

console.log([a, b, c]); //[1,2,3]

迭代器

console.log(x[Symbol.iterator]); //[Function: values]

数组默认有实现迭代器

构造迭代器

let iterator = x[Symbol.iterator]();
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
/**
{ value: 1, done: false }
{ value: 2, done: false }
{ value: 3, done: false }
{ value: 4, done: false }
{ value: undefined, done: true }
*/

迭代器是从头向后迭代、如果迭代器使用时中间插入了新的元素只要在迭代器或之后则迭代器也会做出变化

类迭代器接口,方法实现

class Foo {
[Symbol.iterator]() {
return {
next() {
return {
done: false,
value: 'foo'
}
}
}
}
}
let f = new Foo();
console.log(f[Symbol.iterator]); //[Function: [Symbol.iterator]]

自定义迭代器

class Counter {
constructor(limit) {
this.count = 1;
this.limit = limit;
}
next() {
if (this.count <= this.limit) {
return {
done: false,
value: this.count++
};
} else {
return {
done: true,
value: undefined
};
}
}
[Symbol.iterator]() {
return this;
}
}
let counter = new Counter(3);
for (let i of counter) {
console.log(i); //1 2 3
}

可以利用闭包 返回多个迭代器

[Symbol.iterator](){
let count=1,limit=this.limit;
return {
next(){

}
}
}

提前终止迭代器 hook

当在使用for of 时可能会提前结束 使用 break

提前结束时 会自动调用 迭代器的return方法

class T {
[Symbol.iterator]() {
return {
next() {
return {
done: false
};
},
return () {
console.log("提前终止迭代器");
return {
done: true
};
}
}
}
}
let t = new T();
for (let i of t) {
break; //提前终止迭代器
}