在 JavaScript 中,可迭代对象和迭代器是两个重要的概念,它们为数据的遍历提供了统一的方式。
可迭代对象(Iterable)
可迭代对象是指实现了 Symbol.iterator
方法的对象。Symbol.iterator
是一个内置的 Symbol,用于定义对象的迭代行为。通过实现 Symbol.iterator
方法,对象可以被 for...of
循环、解构赋值等语法使用。
常见的可迭代对象
- 数组(Array):数组是最常见的可迭代对象之一。
const arr = [1, 2, 3];
for (let num of arr) {
console.log(num);
}
- 字符串(String):字符串也是可迭代对象,可以逐字符进行遍历。
const str = 'hello';
for (let char of str) {
console.log(char);
}
- Set 和 Map:ES6 引入的
Set
和Map
也是可迭代对象。
const mySet = new Set([1, 2, 3]);
for (let value of mySet) {
console.log(value);
}
const myMap = new Map([['a', 1], ['b', 2]]);
for (let [key, value] of myMap) {
console.log(key, value);
}
自定义可迭代对象
可以通过实现 Symbol.iterator
方法来创建自定义的可迭代对象。
const myIterable = {
data: [1, 2, 3],
[Symbol.iterator]() {
let index = 0;
return {
next: () => {
if (index < this.data.length) {
return { value: this.data[index++], done: false };
}
return { done: true };
}
};
}
};
for (let value of myIterable) {
console.log(value);
}
迭代器(Iterator)
迭代器是一个对象,它实现了 next
方法,用于返回序列中的下一个值。next
方法返回一个包含 value
和 done
两个属性的对象:
value
:表示当前迭代的值。done
:是一个布尔值,表示迭代是否结束。当done
为true
时,迭代结束。
迭代器的使用
可以手动调用迭代器的 next
方法来进行迭代。
const arr = [1, 2, 3];
const iterator = arr[Symbol.iterator]();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { done: true }
可关闭的迭代器
迭代器可以实现 return
方法,用于在迭代提前终止时执行清理操作。
const myIterable = {
data: [1, 2, 3],
[Symbol.iterator]() {
let index = 0;
return {
next() {
if (index < this.data.length) {
return { value: this.data[index++], done: false };
}
return { done: true };
},
return() {
console.log('迭代提前结束');
return { done: true };
}
};
}
};
const iterator = myIterable[Symbol.iterator]();
for (let value of iterator) {
if (value === 2) {
break;
}
console.log(value);
}
// 输出: 迭代提前结束
可迭代对象和迭代器的区别
- 可迭代对象:是一个更宽泛的概念,它定义了对象可以被迭代的能力,通过实现
Symbol.iterator
方法返回一个迭代器。 - 迭代器:是一个具体的对象,它实现了
next
方法,用于逐个返回序列中的值。