javascript - *[Symbol.iterator] 在这种情况下的含义是什么

标签 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);

现在,我明白 take() 是一个 GeneratorFunction。
当 take() 被调用时,它被赋予一个迭代器。
代码“...printToTwenty”使用扩展运算符迭代该函数。

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

*[Symbol.iterator] () {}

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

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

这个语法是怎么回事,为什么在 [Symbol.iterator] 之前是 *
如果放在后面,它将不会运行。
我曾考虑过 *[Symbol.iterator] () 是一种覆盖现有迭代器属性的方法,但它不会说这个 [Symbol.iterator]。

谢谢!

最佳答案

有几件事可能会使这段代码看起来很复杂:

它使用对象属性的简写符号。您在这里看到的实际上是以下内容:

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

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

因此您的代码基本上意味着 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
// ...

注意:这样写,这个迭代器永远不会结束!因此,如果您要在没有结束条件的 for ... of 循环中调用它,它会卡住您的程序。

关于javascript - *[Symbol.iterator] 在这种情况下的含义是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36976832/

相关文章:

javascript - 如何使用 javascript 或 Jquery 切换 Asp.Net 组合框的可见性

javascript - jQuery 仅在窗口大小调整时运行函数一次

javascript - getElementById 在某些浏览器中是可选的吗?

javascript - 下载 URL 只能将 1 个 php 变量传递给 google map 标记的属性?

javascript - Angular Firebase 查询?

php - 让 validate.js 工作

javascript - 构建 n 进制数字数组的通用公式

javascript - 使用带有 Javascript 的 TypeORM 快速路由

javascript - Javascript 生成的表不显示

javascript - 将项目添加到 Dojo Select dijit 的顶部,但无法选择第二个项目