我真的很难理解其核心思想 ‘迭代器’ “可迭代” ‘发电机’
我感到困惑的主要原因是 所有解释这些概念的文章似乎都在互相补充。
为了解释生成器,文章说“可迭代”来解释“迭代器”,文章使用“生成器” 感觉就像这三个术语无限循环。 谁能告诉我这三个术语是什么意思?
谢谢你。
可能很容易通过类比来解释。假设您有一桶水果,您正在从桶中一个接一个地挑选水果,然后将它们一个接一个地传递给某人。桶,或者您从中获取物品的容器 - 可迭代。你用你的手将水果一一摘下来 - 迭代器。整个你,整个机制用来一一挑选东西,然后将这些东西一一传递给某人 - 生成器。希望这是有道理的。
迭代器:这是所有三个中的基本构建块——它不需要其他术语的定义。它是一个普通对象,至少有一个
next
属性,其值是一个函数(所以它是一个 method)。该 next
函数应该返回一个具有 value
属性的对象,如果可以通过这种方式获取更多值,则该对象应该具有值为 done
的 true
属性。
示例:
const obj = {
next() {
return {
value: Math.random(),
done: true
}
}
}
这个例子是一个代表无限随机数序列的迭代器。您将使用此代码获得下一个:
const r = obj.next().value;
在此示例中,我们不检查
done
属性,但如果(使用另一个迭代器)它恰好为 true,则意味着序列已完全消耗。如果我们只有这个,那么这里就没有魔法或特定的语言支持。您可以调用 next
方法,并决定是否再次调用它。好无聊啊...
下一个术语取决于迭代器的概念,并真正赋予它生命:
Iterable: 任何具有
Symbol.iterator
属性且值为函数的对象。该函数应该返回一个 iterator (见上文)。
Iterables 有特定的语言支持。它们可以在
for..of
构造中使用,这将隐式调用 Symbol.iterator
方法,然后在循环执行时重复调用迭代器对象的 next
方法。
它们也可以用于扩展语法。这将无条件消耗
Symbol.iterator
方法返回的迭代器中的所有值。
一些原生 JavaScript 函数/构造函数返回可迭代对象。数组是可迭代的,映射和集合是可迭代的,...
最后,最后一个术语建立在前两个术语之上:
function*
和 yield
语法的函数)返回的对象。这个对象既是一个 iterator 又是一个 iterable,也就是所谓的 iterable iterator。这里还有很多属性、行为和依赖项需要讨论,但这应该足以让您感受到差异。 Mozilla 贡献者在他们的文章迭代协议以及该文章中链接的文章中提供了更多内容。