JS之迭代器 Iterator
程序员文章站
2024-02-20 20:20:17
...
Symbol.iterator
为每一个对象定义了默认的迭代器。该迭代器可以被 for...of
循环使用。
ES6 规定,默认的 Iterator
接口部署在数据结构的 Symbol.iterator
属性,或者说,一个数据结构只要具有Symbol.iterator
属性,就可以认为是“可遍历的”(iterable)
。Symbol.iterator
属性本身是一个函数,就是当前数据结构默认的遍历器生成函数。
class RangeIterator {
constructor(start, stop) {
this.value = start;
this.stop = stop;
}
[Symbol.iterator]() { return this; }
next() {
var value = this.value;
if (value < this.stop) {
this.value++;
return {done: false, value: value};
}
return {done: true, value: undefined};
}
}
function range(start, stop) {
return new RangeIterator(start, stop);
}
for (var value of range(0, 3)) {
console.log(value); // 0, 1, 2
}
const obj = {
data: ["hello", "world"],
[Symbol.iterator]() {
const self = this;
let index = 0;
return {
next() {
if (index < self.data.length) {
return {
value: self.data[index++] + "!",
done: false
};
} else {
return { value: undefined, done: true };
}
}
};
}
};
for (let o of obj) {
console.log(o); // "hello!" "world!"
}
Iterator
的遍历过程是这样的:
- 创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
- 第一次调用指针对象的
next
方法,可以将指针指向数据结构的第一个成员。 - 第二次调用指针对象的
next
方法,指针就指向数据结构的第二个成员。 - 不断调用指针对象的
next
方法,直到它指向数据结构的结束位置。
每一次调用next
方法,都会返回数据结构的当前成员的信息。具体来说,就是返回一个包含value
和done
两个属性的对象。其中,value
属性是当前成员的值,done
属性是一个布尔值,表示遍历是否结束。
参考:
- https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator
- https://www.jianshu.com/p/886354c26ec9
- https://codesandbox.io/s/upbeat-wood-bum3j?file=/src/index.js
上一篇: JS iterator
下一篇: vim常用配置