gpt4 book ai didi

javascript - Javascript 中的迭代器和生成器?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:22:04 25 4
gpt4 key购买 nike

在 Mozilla 的页面上 iterators and generators有一个声明:

While custom iterators are a useful tool, their creation requires careful programming due to the need to explicitly maintain their internal state. Generators provide a powerful alternative: they allow you to define an iterative algorithm by writing a single function which can maintain its own state.

关于上面的解释,没有生成器是不是可以写一个迭代算法,比如:

Array[Symbol.iterator] = function(){
return {
next: function(){
//logic
return {
value: "",
done:false
}
}
}
}

我的脑袋转不过来。有人可以解释一下他们创建替代方案的主要原因是什么,对我来说似乎没什么不同。

最佳答案

它们在表面上看起来可能非常相似,但它们可以以非常不同的方式使用。

迭代器和可迭代对象

迭代器的定义相当严格:它们是包含next(可能还有其他一些)函数的对象(迭代器)。每次调用 next 函数时,它都应该返回一个具有两个属性的对象:

  • value:迭代器的当前值
  • done:迭代器完成了吗?

另一方面,可迭代对象是一个对象,该对象的属性带有 Symbol.iterator 键(表示众所周知的符号 @@iterator)。该键包含一个函数,该函数在被调用时返回一个新的迭代器。一个可迭代的例子:

const list = {
entries: { 0: 'a', 1: 'b' },
[Symbol.iterator]: function(){
let counter = 0;
const entries = this.entries;
return {
next: function(){
return {
value: entries[counter],
done: !entries.hasOwnProperty(counter++)
}
}
}
}
};

顾名思义,它们的主要目的是提供一个可以迭代的接口(interface):

for (let item of list) { console.log(item); }
// 'a'
// 'b'

生成器

另一方面,生成器的用途要广泛得多。将它们视为可以暂停和恢复的功能会有所帮助。

虽然它们可以迭代(它们的可迭代对象提供了一个next 方法),但它们可以实现更复杂的过程并通过它们的next 方法提供输入/输出通信。

一个简单的生成器:

function *mygen () {
var myVal = yield 12;
return myVal * 2;
}

const myIt = mygen();

const firstGenValue = myIt.next().value;
// Generator is paused and yields the first value

const result = myIt.next(firstGenValue * 2).value;

console.log(result); // 48

生成器委托(delegate)

生成器可以委托(delegate)给另一个生成器:

function *mydelgen(val) {
yield val * 2;
}

function *mygen () {
var myVal = yield 12;
yield* mydelgen(myVal); // delegate to another generator
}

const myIt = mygen();
const val = myIt.next().value;
console.log(val);
console.log(myIt.next(val).value);
console.log(myIt.next().value);

生成器和 promise

Generators 和 Promises 可以在诸如 co 等实用程序的帮助下创建一种自动异步迭代器。 .

co(function *(){
// resolve multiple promises in parallel
var a = Promise.resolve(1);
var b = Promise.resolve(2);
var c = Promise.resolve(3);
var res = yield [a, b, c];
console.log(res);
// => [1, 2, 3]
}).catch(onerror);

总结

总而言之,迭代器的主要目的是为要迭代的自定义对象创建一个接口(interface),而生成器为同步和异步工作流提供了多种可能性:

  • 有状态函数
  • 发电机代表团
  • 生成器和 promise
  • CSP

等等

关于javascript - Javascript 中的迭代器和生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37124006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com