Generator
åºçº¿
广æ³å¯ç¨
èª 2016å¹´9æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
Generator 对象ç±çæå¨å½æ°è¿åå¹¶ä¸å®ç¬¦åå¯è¿ä»£åè®®åè¿ä»£å¨åè®®ã
Generator æ¯éèç±» Iterator çåç±»ã
å°è¯ä¸ä¸
const foo = function* () {
yield "a";
yield "b";
yield "c";
};
let str = "";
for (const val of foo()) {
str = str + val;
}
console.log(str);
// Expected output: "abc"
æé 彿°
Generator æé 彿°å¹¶ä¸æ¯å
¨å±å¯ç¨çãGenerator çå®ä¾å¿
é¡»ä»çæå¨å½æ°è¿åï¼
function* generator() {
yield 1;
yield 2;
yield 3;
}
const gen = generator(); // "Generator { }"
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3
å®é
ä¸ï¼å¹¶æ²¡æå¯¹åº Generator æé 彿°ç JavaScript å®ä½ãåªæä¸ä¸ªéè对象ï¼å
¶æ¯ææç±çæå¨å½æ°å建ç对象æå
±äº«çåå对象ãè¿ä¸ªå¯¹è±¡éå¸¸è¢«é£æ ¼å为 Generator.prototype æ¥ä½¿å
¶çèµ·æ¥åæ¯ä¸ä¸ªç±»ï¼ä½å®æ´æ°å½çç§°å¼åºè¯¥æ¯ GeneratorFunction.prototype.prototypeï¼å 为 GeneratorFunction æ¯ä¸ä¸ªå®é
ç JavaScript å®ä½ã
å®ä¾å±æ§
è¿äºå±æ§å®ä¹äº Generator.prototype å¹¶ç±ææ Generator å®ä¾æå
±äº«ã
Generator.prototype.constructor-
å建å®ä¾å¯¹è±¡çæé 彿°ã对äº
Generatorå®ä¾ï¼å ¶åå§å¼æ¯GeneratorFunction.prototypeã夿³¨ï¼
Generator对象ä¸ä¼åå¨å建å®ä»¬ççæå¨å½æ°çå¼ç¨ã Generator.prototype[Symbol.toStringTag]-
[Symbol.toStringTag]屿§çåå§å¼æ¯å符串"Generator"ãè¯¥å±æ§è¢«Object.prototype.toString()使ç¨ã
å®ä¾æ¹æ³
åæ¶ä¹ä»å
¶ç¶ç±» Iterator ç»§æ¿å®ä¾æ¹æ³ã
Generator.prototype.next()-
è¿å
yield表达å¼çæçå¼ã Generator.prototype.return()-
类似äºå¨å½åççæå¨ä¸»ä½çæåä½ç½®æå ¥
returnè¯å¥ï¼è¯¥è¯å¥ç»æäºçæå¨å¹¶ä¸å 许çæå¨ä¸try...finallyåç¸ç»åæ¶ï¼æ§è¡ä»»ä½æ¸ çä»»å¡ã Generator.prototype.throw()-
类似äºå¨å½åççæå¨ä¸»ä½çæåä½ç½®æå ¥
throwè¯å¥ï¼è¯¥è¯å¥éç¥çæå¨æéè¯¯çæ åµå¹¶ä¸å è®¸å ¶å¤çéè¯¯ææ§è¡æ¸ çå¹¶èªè¡å ³éã
示ä¾
>æ ç©·è¿ä»£å¨
éè¿çæå¨å½æ°ï¼å¼åªæå¨å ¶è¢«éè¦æ¶æä¼è¿è¡è®¡ç®ãå æ¤ï¼çæå¨å 许æä»¬å®ä¹ä¸ä¸ªæ½å¨çæ ç©·æ°æ®ç»æã
function* infinite() {
let index = 0;
while (true) {
yield index++;
}
}
const generator = infinite(); // "Generator { }"
console.log(generator.next().value); // 0
console.log(generator.next().value); // 1
console.log(generator.next().value); // 2
// â¦
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-generator-objects> |