在此上下文中*[Symbol.iterator]的含义是什么?

Cap*_*ate 16 javascript

我在网上找到了一些代码.我已将原始代码压缩到这个小小的摘录中,当运行时,将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);
Run Code Online (Sandbox Code Playgroud)

现在,我知道take()是一个GeneratorFunction.
调用take()时,会给它一个迭代器.
代码"... printToTwenty"使用spread运算符来遍历该函数.

我知道NumbersFromOne是一个对象.我来这里寻找这部分含义的解释:

*[Symbol.iterator] () {}
Run Code Online (Sandbox Code Playgroud)

声明生成器函数是这样完成的:function*(){}
所以我假设这不是声明生成器函数.

*也不代表函数名
*也不能用其他运算符替换(/, - ,+)

该语法有什么处理,为什么在[Symbol.iterator]之前的*
如果放在之后,它将不会运行.
我曾经认为*[Symbol.iterator]()是一种覆盖现有迭代器属性的方法,但是它不会说这个[Symbol.iterator].

谢谢!

nil*_*ils 19

有一些事情可能会使这段代码变得复杂:

它使用object属性简写表示法.您在这里看到的实际上是以下内容:

var NumbersFromOne = {
  [Symbol.iterator]: function* () {
    for (let i = 1;; ++i) yield i;
  }
};
Run Code Online (Sandbox Code Playgroud)

Symbol.iterator为您的NumbersFromOne对象创建自定义迭代器.

所以你的代码基本上意味着迭代器NumbersFromOne被定义为生成器.而不是手动必须定义一个返回下一个和其他属性的函数:

var NumbersFromOne = {
  [Symbol.iterator]: function () {
    var i = 1;
    return {
        next: function() {
            return { value: i++, done: false };
        }
    };
  }
};
Run Code Online (Sandbox Code Playgroud)

返回生成器会next自动为您创建函数,并允许您在需要时生成函数.

然后它可以被称为:

const it = NumbersFromOne[Symbol.iterator]();
it.next(); // 1
it.next(); // 2
it.next(); // 3
// ...
Run Code Online (Sandbox Code Playgroud)

注意:这样编写,这个迭代器永远不会结束,所以如果你在for ... of没有结束条件的循环中调用它,它会冻结你的程序.