要使对象支持 for...of
迭代,你需要使该对象具有符合迭代协议的迭代器。实现这一点的方法是为对象定义一个名为 Symbol.iterator
的方法。这个方法应该返回一个迭代器对象,迭代器对象必须有一个 next
方法,该方法返回一个对象,其中包含 value
和 done
属性。
以下是实现过程的步骤和示例代码:
1. 实现 Symbol.iterator
方法
1.1 定义迭代器对象
迭代器对象需要实现 next
方法,next
方法返回一个对象,包含两个属性:
value
:当前的值。done
:一个布尔值,指示迭代是否完成。
1.2 在对象中实现 Symbol.iterator
将 Symbol.iterator
方法定义在对象上,这样对象就变成了可迭代的。
示例代码
示例 1: 基本对象
const myObject = {
items: ["a", "b", "c"],
[Symbol.iterator]() {
let index = 0;
const items = this.items;
return {
next() {
if (index < items.length) {
return { value: items[index++], done: false };
} else {
return { done: true };
}
},
};
},
};
// 使用 for...of 进行迭代
for (const item of myObject) {
console.log(item); // 'a', 'b', 'c'
}
示例 2: 自定义对象
function createIterableObject() {
return {
start: 1,
end: 5,
[Symbol.iterator]() {
let current = this.start;
const end = this.end;
return {
next() {
if (current <= end) {
return { value: current++, done: false };
} else {
return { done: true };
}
},
};
},
};
}
const iterableObject = createIterableObject();
// 使用 for...of 进行迭代
for (const num of iterableObject) {
console.log(num); // 1, 2, 3, 4, 5
}
3. 注意事项
- 生成器:生成器函数(
function*
)可以更方便地创建可迭代对象,它自动实现了Symbol.iterator
方法,并简化了迭代器的代码。
示例 3: 使用生成器
function* range(start, end) {
for (let i = start; i <= end; i++) {
yield i;
}
}
const iterableObject = range(1, 5);
// 使用 for...of 进行迭代
for (const num of iterableObject) {
console.log(num); // 1, 2, 3, 4, 5
}