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

2024-06-04

我在网上找到了一些代码。我将原始代码压缩成这个小摘录,运行时会将 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(使用前将#替换为@)

在这种情况下 *[Symbol.iterator] 的含义是什么 的相关文章

  • 查找表格单元格的值

    tbody tbody
  • 如何使用 JavaScript 动态设置 `onSubmit`

    现在我有点进退两难 因为我无法编辑onSubmit我的表单 所以我必须动态设置它 我的问题是 我不知道如何在不覆盖已有值的情况下执行此操作onSubmit例如 假设我有以下代码
  • 如何在 JavaScript 中接受键盘输入?

    我想在 JavaScript 中进行键盘输入 按下箭头键时 将导致特定形状的形状发生变化 如何获取 JavaScript 中任意键的输入 你可以通过以下方式做到这一点注册一个事件处理程序 http www quirksmode org js
  • 如何选择并单击所有 html 复选框?

    我想要选择并单击all网页中的复选框 我试过了 document querySelectorAll button role checkbox forEach e gt e click Also document querySelectorA
  • SweetAlert - 更改模态宽度?

    我喜欢这个图书馆 我想用它在我的一个网页上显示一个中等响应表 但文本有点宽 我希望有一个选项可以更改我在 SweetAlert 中显示表格的页面的整体警报宽度 但我没有任何运气 表格和 HTML 看起来很棒 只是模式的信息太多了 我什至找不
  • 包含 ng-template 的指令中的角度嵌入(通用确认模态)

    您好 我在创建基于 Angular bootstrap Modal 指令的通用确认指令时遇到了困难 我找不到一种方法来将我的内容嵌入到用于模态构造的 ng template 中 因为ng transclude指令不会被评估 因为它是ng t
  • 获取kendo下拉值的选定id

    如何从下拉列表中获取所选名称的 ID 当选择Apples然后得到了id1并选择Oranges then 2 这是简单的剑道下拉示例
  • 将表格单元格添加到现有表格行,jQuery

    我正在尝试使用 jQuery 将值添加到表中 不幸的是 我不知道如何让 jQuery 将表单元格添加到现有行 例如 td a href key a td click function e e preventDefault testset k
  • 如何动态获取浏览器的高度和宽度?

    我想做的是创建一个不依赖媒体查询的聊天框 这从数学上设置了聊天框内容的大小 我正在尝试 window height window width 但这并没有覆盖整个浏览器窗口 我想在 javascript jquery 中完成这一切 而不需要
  • 如何在 javascript 中检查 url 地址是否以定义的字符串开头?

    是否可以检查 url 地址是否以以下开头 http www odsavacky cz blog wpcproduct http www odsavacky cz blog wpcproduct 只需使用普通的字符串搜索 if the url
  • Chrome 扩展弹出窗口的非阻塞警报

    我正在制作一个 chrome 扩展 为此我需要在弹出窗口中添加一些非阻塞警报 定期警报会暂停 javascript 代码执行 而客户端并不希望这样 我尝试使用 jQuery 的 UI 对话框 但是当我单击 确定 按钮关闭它时 弹出窗口失去焦
  • 在容器大小调整时调整传单地图的大小

    我有一个 div 包含传单地图 在某些事件发生时 高度 div 将会被改变 我希望地图能够调整到其周围的新尺寸 div 以便旧中心位于调整大小的较小或较大地图的中心 我尝试使用invalidateSize 功能 但似乎根本不起作用 之后如何
  • 在条件 for 循环中渲染 React

    我在网页中有静态信息 class MyStaticWebPage extends React Component render return
  • WebSocket 已处于 CLOSING 或 CLOSED 状态。

    我尝试使用 Javascript PHP 和 Wamp 执行 WebSocket 但在发送时出现错误 WebSocket 已处于 CLOSING 或 CLOSED 状态 我已经使用了源代码here http sii rennes devel
  • 正则表达式替换“NO-BREAK SPACE”

    我正在寻找一个正则表达式来替换字符串中的 NO BREAK SPACE 有一些与 NO BREAK SPACE 相关的问题 但似乎没有一个问题能让我找到正确的答案 到目前为止 我尝试使用 字符串 AB 的第二个字符是不间断空格 但没有成功
  • 使用 querySelectorAll 获取选定的选项

    我想知道是否可以在 Javascript 中获取当前选定的选项
  • Javascript 正则表达式替换,多行

    我有一些文本内容 使用 jQuery 从 HTML 读取 看起来像以下示例之一 span 39 98 span br USD 或跨多条线支付额外费用 例如
  • 为什么动态安装的 vuejs 内容不是根 vue 实例的子组件?

    我加载一些包含自定义组件的 html 并将该内容挂载到父组件中的固定节点 不幸的是 我发现它们之间没有父子关系 因此动态插入的组件派发的事件无法被根vue接收 我创建了一把小提琴 任何帮助或建议都将受到赞赏 http jsfiddle ne
  • 谷歌地图如何将图像添加到InfoWindow中

    您好 我正在尝试将图像添加到谷歌地图信息窗口中 我的代码就像这样的脚本 var ContactUs function return main function to initiate the module init function var
  • 无法使用带有 socket.io 的媒体源从媒体记录器跳转到流

    当首先加载视频观察客户端然后加载网络摄像头客户端时 以下代码可以正常工作 但是 如果顺序交换或以任何方式中断流 例如通过刷新任一客户端 则流将失败并且媒体源会将其就绪状态更改为关闭 我的假设是 在开始时接收的视频需要初始化标头才能启动 并且

随机推荐