ser*_*kan 4 javascript ecmascript-6
在Mozilla的页面迭代器和生成器上有一个声明:
虽然自定义迭代器是一个有用的工具,但由于需要显式维护其内部状态,因此需要仔细编程.生成器提供了一个强大的替代方案:它们允许您通过编写可以维持其自身状态的单个函数来定义迭代算法.
关于上述说明,不可能在没有发生器的情况下编写迭代算法,例如:
Array[Symbol.iterator] = function(){
return {
next: function(){
//logic
return {
value: "",
done:false
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
无法理解我的头脑.有人可以解释一下他们创造替代品的主要原因是什么,对我来说似乎并没有什么不同.
它们在表面上可能看起来非常相似,但它们可以以非常不同的方式使用.
迭代器和Iterables
迭代器是相当严格定义的:它们是包含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++)
}
}
}
}
};
Run Code Online (Sandbox Code Playgroud)
顾名思义,它们的主要目的是提供一个可以迭代的接口:
for (let item of list) { console.log(item); }
// 'a'
// 'b'
Run Code Online (Sandbox Code Playgroud)
发电机
另一方面,发电机更加通用.它有助于将它们视为可以暂停和恢复的功能.
虽然它们可以迭代(它们的迭代提供了一种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
Run Code Online (Sandbox Code Playgroud)
发电机代表团
生成器可以委托给另一个生成器:
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);
Run Code Online (Sandbox Code Playgroud)
发电机和承诺
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);
Run Code Online (Sandbox Code Playgroud)
结论
总而言之,我们可以说迭代器的主要目的是为自定义对象创建一个迭代接口,而生成器为同步和异步工作流提供了大量的可能性:
等等
| 归档时间: |
|
| 查看次数: |
1623 次 |
| 最近记录: |