实现自定义可迭代对象及遍历方式
// 定义一个自定义可迭代对象
const myIterable = {
data: [1, 2, 3, 4, 5],
// 实现Symbol.iterator方法,这是可迭代对象的关键
[Symbol.iterator]() {
let index = 0;
const self = this;
return {
next() {
if (index < self.data.length) {
return { value: self.data[index++], done: false };
}
return { done: true };
}
};
}
};
// 使用for...of遍历
console.log('使用for...of遍历:');
for (const value of myIterable) {
console.log(value);
}
// 使用迭代器手动迭代
console.log('使用迭代器手动迭代:');
const iterator = myIterable[Symbol.iterator]();
let result = iterator.next();
while (!result.done) {
console.log(result.value);
result = iterator.next();
}
实现自定义可迭代对象的关键要点
- 实现
Symbol.iterator
方法:这是使对象成为可迭代对象的关键。该方法必须返回一个迭代器对象,迭代器对象需要包含 next
方法,next
方法返回一个包含 value
和 done
属性的对象,value
表示当前迭代的值,done
是一个布尔值,当 done
为 true
时,表示迭代结束。
- 迭代器的状态管理:在
next
方法内部需要正确管理迭代的状态,例如使用一个变量记录当前迭代的位置,以确保每次调用 next
方法都能返回正确的值,直到迭代结束。
- 确保迭代的一致性:无论使用哪种遍历方式(如
for...of
、手动迭代等),都应该保证遍历的顺序和结果是一致的。
- 处理边界情况:在
next
方法中要正确处理迭代结束的情况,即当没有更多值可迭代时,done
应设置为 true
,且 value
不应再有有意义的值(通常为 undefined
)。