2

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

PS:当我们需要对一个大数组进行一次迭代 时,Python的Generator非常节省内存,hash... “生成器是可迭代的,但你只能读取一次。这是因为它们不会将所有值都存储在内存中,他们即时生成价值

(Python 的生成器在此线程中解释:“yield”关键字在 Python 中的作用是什么?

4

4 回答 4

2

不是以标准方式。一些浏览器已经实现了python 样式的生成器,但它们需要需要显式激活的扩展。有人提议将生成器添加到 ECMAScript 规范的下一个版本中,但我认为它不会很快可用。

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

于 2012-06-23T03:13:07.950 回答
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();
}
于 2012-06-23T03:56:20.583 回答
1

在 JavaScript 1.7 中:

function rangeGen(n) {
    for (let i = 0; i < n; i++)
        yield i;
}
于 2012-06-23T03:14:25.647 回答
0

您可以使用yield关键字。您可以在此处(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

现在得到广泛支持:caniuse , MDN


打字稿符号:

function* range(n: number): IterableIterator<number> {
    for (let i = 0; i < n; i++) {
        yield i;
    }
}
于 2022-02-10T19:52:27.217 回答