ES6 中原生实现了迭代器的数据结构可以像下面那样使用for of进行遍历
const arr = [ 1, 2, 3 ]
const iter = arr[Symbol.iterator]()
for (const item of iter) {
console.log(item) // 1 2 3
}
const iter2 = iter[Symbol.iterator]()
console.log(iter === iter2) // true
const iter3 = iter[Symbol.iterator]()[Symbol.iterator]()[Symbol.iterator]()
console.log(iter === iter3) // true
问题是我自定义了一个迭代器,如何像原生迭代器那样实现Iterable
接口来做到像上面那样使用 for of?
class Counter {
constructor(limit) {
this.limit = limit
}
[Symbol.iterator]() {
let count = 1,
limit = this.limit
return {
next() {
if (count <= limit) {
return { done: false, value: count++ }
} else {
return { done: true, value: undefined }
}
},
[Symbol.iterator]() {
// 这里该如何实现?
}
}
}
}
const counter = new Counter(5)
const iter = counter[Symbol.iterator]()
const iter2 = iter[Symbol.iterator]()
console.log(iter === iter2) // false
for (const item of iter) { // Undefined is not a function
// Some Code
}