【问题标题】:JavaScript: Is there any "python's Generator" equivalent in JavaScript?JavaScript:JavaScript 中是否有任何“python 的生成器”等价物?
【发布时间】:2012-06-23 03:07:04
【问题描述】:

JavaScript 中是否有任何“python 的生成器”等价物?

PS: 当我们需要 一次 迭代 数组、散列...
“生成器是可迭代的,但 Python 的生成器非常节省内存只能读取一次。这是因为它们不会将所有值存储在内存中,它们会即时生成值"

(Python 的生成器在此线程中解释:What does the "yield" keyword do in Python?

【问题讨论】:

标签: javascript iteration


【解决方案1】:

不是以标准方式。一些浏览器already implement python 样式的生成器,但它们需要需要显式激活的扩展。 有人建议 add generators 提出下一版本的 ECMAScript 规范,但我认为它不会很快可用。

到目前为止,您能做的最好的事情就是使用老派的external iterator 模式。它同样强大,尽管在更复杂的情况下编写起来很痛苦。

【讨论】:

【解决方案2】:

这不是超级实用,但是你可以像这样达到同样的基本效果:

function make_generator(start, end) {
  var i=start;
  return function() {
    if (i<end) {
      output = i;
      i += 1;
      return output;
    }
    else {
      return null;
    }
  }
}
var out = document.getElementById('out');
var generator = make_generator(1,10);
var g = generator();
while (g) {
  if (out.innerHTML)
    out.innerHTML = out.innerHTML + '<br>' + g;
  else
    out.innerHTML = g;
  g = generator();
}

【讨论】:

  • 我更喜欢返回自定义对象或抛出异常来表示迭代结束的方法。这些允许您迭代包含 null 或未定义成员的事物。
【解决方案3】:

在 JavaScript 1.7 中:

function rangeGen(n) {
    for (let i = 0; i < n; i++)
        yield i;
}

【讨论】:

【解决方案4】:

您可以使用yield 关键字。你可以阅读更多关于它的信息here (MDN)。

yield 关键字用于暂停和恢复生成器函数

function* range(n) {
    for (let i = 0; i < n; i++) {
        yield i;
    }
}

const generator = range(10);

console.log(generator.next());  // { value: 0, done: false }
console.log(generator.next());  // { value: 1, done: false }
...
console.log(generator.next());  // { value: 9, done: false }
console.log(generator.next());  // { value: undefined, done: true }

注意function 关键字后面的*

现在得到广泛支持:caniuseMDN


TypeScript 表示法:

function* range(n: number): IterableIterator<number> {
    for (let i = 0; i < n; i++) {
        yield i;
    }
}

【讨论】:

    猜你喜欢
    • 2021-06-14
    • 2014-03-08
    • 2014-05-26
    • 2015-05-19
    • 1970-01-01
    • 2014-01-09
    • 2021-03-29
    • 2012-07-17
    • 2012-06-14
    相关资源
    最近更新 更多