我在网上找到了一些代码。我将原始代码压缩成这个小摘录,运行时会将 1-20 打印到控制台。
var NumbersFromOne = {
*[Symbol.iterator] () {
for (let i = 1;; ++i) yield i;
}
};
var take = function* (numberToTake, iterable) {
let remaining = numberToTake;
for (let value of NumbersFromOne) {
if (remaining-- <= 0) break;
yield value;
}
}
var printToTwenty = take(20, NumbersFromOne)
console.log(...printToTwenty);
现在,我明白 take() 是一个 GeneratorFunction。
当调用 take() 时,它会被赋予一个迭代器。
代码“...printToTwenty”使用扩展运算符来迭代该函数。
我知道 NumbersFromOne 是一个对象。
我来这里是为了寻找这部分含义的解释:
*[Symbol.iterator] () {}
声明生成器函数的方式如下: function* () {}
所以我假设这不是声明生成器函数。
* 也不代表函数名
* 也不能替换为其他运算符(/、-、+)
该语法的处理方式是什么,为什么 [Symbol.iterator] 之前有 *
如果放在后面,它将不会运行。
我曾考虑过 *[Symbol.iterator] () 是一种覆盖现有迭代器属性的方法,但它不会说 this[Symbol.iterator].
Thanks!
有几件事可能会使这段代码看起来很复杂:
它使用对象属性速记符号。您在这里看到的实际上是以下内容:
var NumbersFromOne = {
[Symbol.iterator]: function* () {
for (let i = 1;; ++i) yield i;
}
};
Symbol.iterator https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator为您创建一个自定义迭代器NumbersFromOne
object.
所以你的代码基本上意味着迭代器NumbersFromOne
被定义为生成器。不必手动定义返回 next 和其他属性的函数:
var NumbersFromOne = {
[Symbol.iterator]: function () {
var i = 1;
return {
next: function() {
return { value: i++, done: false };
}
};
}
};
返回生成器会创建next
功能自动进行。这使您可以在需要时屈服。
然后它可以被称为:
const it = NumbersFromOne[Symbol.iterator]();
it.next(); // 1
it.next(); // 2
it.next(); // 3
// ...
Note:这样写,这个迭代器永远不会结束!所以如果你要在 a 中调用它for ... of
没有结束条件的循环,它会冻结你的程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)