在注释中指出:
The iterable protocol allows JavaScript objects to define or customize their iteration behavior, such as what values are looped over in a for..of construct.
当我已经可以使用 Object.degineProperty 来使某些内容可枚举时,我看不出这有什么好处。
function withValue(value) {
var d = withValue.d || (
withValue.d = {
enumerable: false,
writeable: false,
configuration: false,
value: null
}
)
// other code;
}
这些协议(protocol)有什么好处?如果这只是一些新的语法来安抚新的 for...of 循环,那么除了简单地检查长度并查看“列表”中的项目是否用完之外,它还有什么好处。
最佳答案
将 Iterable 视为一个接口(interface)。您可以放心,实现包含 Symbol.iterator
属性,该属性实现 next()
方法。如果您自己实现,则可以生成要在运行时迭代的值。作为一个简单的示例,生成一个列表,然后决定要迭代多少个(或哪个,或任何标准):
function List (...args) {
this.getOnly = function (limit) (
const effectiveLimit = Math.min(args.length, limit + 1);
const iterable = {
[Symbol.iterator]() {
let count = 0;
const iterator = {
next() {
if (count < effectiveLimit) {
return { value: args[count++] };
} else {
return { done: true };
}
}
};
return iterator;
}
}
return iterable;
};
}
const list = List(0, 1, 2, 3, 4);
for (const x of list.getOnly(3)) {
console.log(x);
}
// returns 0, 1, 2
如果您使用实现 Iterable 接口(interface)的 Generator 函数,那么事情就会变得非常简单:
function List (...args) {
this.getOnly = function* (limit) {
const effectiveLimit = Math.min(args.length, limit + 1);
for (let count = 0; count < effectiveLimit; count++) {
yield args[count];
}
}
}
列出了有关可使用 Iterables 执行的更多示例 here .
关于javascript - 理解迭代器协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45397780/