ES6 自定义迭代器如何做到像原生迭代器那样实现 Iterable 接口?
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
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
用生成器,而且对象有迭代器的话for...of会自动执行的,不需要显式的去执行
之前还没意识到这个问题,这说明内置可迭代对象返回的迭代器也是个可迭代对象(额,有点绕~)并且两者的迭代器是相等的,回到你自定义的
Counter
,这样修改: