JavaScript 可迭代对象
可迭代对象(Iterables)是可以使用 for..of 进行迭代的对象。
从技术上讲,可迭代对象必须实现 Symbol.iterator 方法。
JavaScript 迭代器
迭代器协议定义了如何从一个对象中生成一系列的值。
当一个对象实现了 next() 方法时,它就成为了一个迭代器。
next() 方法必须返回一个带有两个属性的对象:
value(下一个值)done(true 或 false)
| value |
迭代器返回的值 (如果 done 为 true,则可以省略) |
| done |
如果迭代器已经完成,则返回 true 如果迭代器产生了一个新值,则返回 false |
自制的可迭代对象
这个可迭代对象会无限返回:10、20、30、40...... 当每次调用 next() 时:
实例
// 自制的可迭代对象
function myNumbers() {
let n = 0;
return {
next: function() {
n += 10;
return {value:n, done:false};
}
};
}
// 创建可迭代对象
const n = myNumbers();
n.next(); // Returns 10
n.next(); // Returns 20
n.next(); // Returns 30
注意:自制的可迭代对象存在问题,它不支持 JavaScript 中的 for..of 语句。
JavaScript 中的可迭代对象是具有 Symbol.iterator 属性的对象。
Symbol.iterator 是一个返回 next() 函数的函数。
可以使用以下代码迭代可迭代对象:for (const x of iterable) { }
实例
// 创建对象
myNumbers = {};
// 使其可迭代
myNumbers[Symbol.iterator] = function() {
let n = 0;
done = false;
return {
next() {
n += 10;
if (n == 100) {done = true}
return {value:n, done:done};
}
};
}
现在您可以使用 for..of 了:
for (const num of myNumbers) {
// 这里可写任何代码
}
Symbol.iterator 方法会被 for..of 自动调用。
但是我们也可以手动调用它:
实例
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) break;
// 这里可写任何代码
}