Baseline Widely available
function*
声æå建ä¸ä¸ªç»å®å°ç»å®åç§°çæ°çæå¨å½æ°ãçæå¨å½æ°å¯ä»¥éåºï¼å¹¶å¨ç¨åéæ°è¿å
¥ï¼å
¶ä¸ä¸æï¼åéç»å®ï¼ä¼å¨éæ°è¿å
¥æ¶ä¿åã
ä½ ä¹å¯ä»¥ä½¿ç¨ function*
è¡¨è¾¾å¼æ¥å®ä¹çæå¨å½æ°ã
function* generator(i) {
yield i;
yield i + 10;
}
const gen = generator(10);
console.log(gen.next().value);
// Expected output: 10
console.log(gen.next().value);
// Expected output: 20
è¯æ³
function* name(param0) {
statements
}
function* name(param0, param1) {
statements
}
function* name(param0, param1, /* â¦, */ paramN) {
statements
}
夿³¨ï¼ ç®å¤´å½æ°ä¸è½ç¨æ¥å®ä¹çæå¨å½æ°ã
夿³¨ï¼ function
å *
æ¯ä¸¤ä¸ªåç¬çæ è®°ï¼å æ¤å®ä»¬å¯ä»¥ç¨ç©ºç½ææ¢è¡ç¬¦åéã
name
彿°åç§°ã
param
å¯é
彿°çå½¢ååç§°ãæå ³åæ°çè¯æ³ï¼è¯·åé 彿°åèã
statements
å¯é
ææå½æ°ä½çè¯å¥ã
function*
声æå建ä¸ä¸ª GeneratorFunction
å¯¹è±¡ãæ¯æ¬¡è°ç¨çæå¨å½æ°æ¶ï¼å®é½ä¼è¿åä¸ä¸ªæ°ç Generator
对象ï¼è¯¥å¯¹è±¡ç¬¦åè¿ä»£å¨åè®®ãå½è¿ä»£å¨ç next()
æ¹æ³è¢«è°ç¨æ¶ï¼çæå¨å½æ°ç主ä½ä¼è¢«æ§è¡ï¼ç´å°éå°ç¬¬ä¸ä¸ª yield
表达å¼ï¼è¯¥è¡¨è¾¾å¼æå®äºè¿ä»£å¨è¦è¿åçå¼ï¼æè
ç¨ yield*
å§æç»å¦ä¸ä¸ªçæå¨å½æ°ãnext()
æ¹æ³è¿åä¸ä¸ªå¯¹è±¡ï¼å
¶ value
屿§å
å«äº yield
表达å¼çå¼ï¼done
屿§æ¯å¸å°ç±»åï¼è¡¨ç¤ºçæå¨æ¯å¦å·²ç»è¿åäºæåä¸ä¸ªå¼ã妿 next()
æ¹æ³å¸¦æåæ°ï¼é£ä¹å®ä¼æ¢å¤çæå¨å½æ°çæ§è¡ï¼å¹¶ç¨åæ°æ¿æ¢æåæ§è¡ç yield
表达å¼ã
å¨ JavaScript ä¸ï¼çæå¨ââå°¤å ¶æ¯ä¸ Promises ç»åä½¿ç¨æ¶ââæ¯ä¸ç§é常强大ç弿¥ç¼ç¨å·¥å ·ï¼å®ä»¬è§£å³äºåè°å½æ°åå¨çä¸äºçé®é¢ï¼å¦åè°å°ç±åæ§å¶å转ãç¶èï¼éè¿ä½¿ç¨å¼æ¥å½æ°ï¼æä»¬å¯ä»¥æ´ç®åå°è§£å³è¿äºé®é¢ã
å¨çæå¨ä¸æ§è¡ return
è¯å¥ä¼ä½¿çæå¨ç»æï¼å³è¿åç对象ç done
屿§å°è¢«è®¾ç½®ä¸º true
ï¼ã妿è¿åä¸ä¸ªå¼ï¼å®å°è¢«è®¾ç½®ä¸ºçæå¨è¿åç对象ç value
屿§ãä¸ return
è¯å¥ç±»ä¼¼ï¼å¦æçæå¨å
鍿åºé误ï¼çæå¨ä¹ä¼ç»æï¼é¤éå¨çæå¨ç代ç ä½å
æè·è¯¥é误ãå½çæå¨ç»æåï¼åç» next()
è°ç¨ä¸ä¼æ§è¡çæå¨çä»»ä½ä»£ç ï¼åªä¼è¿åä¸ä¸ªå½¢å¦ {value: undefined, done: true}
ç对象ã
function*
声æçè¡ä¸ºä¸ function
声æç±»ä¼¼ââå®ä»¬ä¼è¢«æåå°å
¶ä½ç¨åçé¡¶é¨ï¼å¹¶ä¸å¯ä»¥å¨å½åä½ç¨åçä»»ä½ä½ç½®è¢«è°ç¨ï¼ä¸åªè½å¨ç¹å®çä¸ä¸æä¸è¢«éæ°å£°æã
function* idMaker() {
let index = 0;
while (true) {
yield index++;
}
}
const gen = idMaker();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3
// â¦
ä½¿ç¨ yield* 示ä¾
function* anotherGenerator(i) {
yield i + 1;
yield i + 2;
yield i + 3;
}
function* generator(i) {
yield i;
yield* anotherGenerator(i);
yield i + 10;
}
const gen = generator(10);
console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next().value); // 13
console.log(gen.next().value); // 20
ä¼ å
¥åæ°ç»çæå¨
function* logGenerator() {
console.log(0);
console.log(1, yield);
console.log(2, yield);
console.log(3, yield);
}
const gen = logGenerator();
// next çç¬¬ä¸æ¬¡è°ç¨ä»å½æ°çå¼å¤´å¼å§æ§è¡ï¼ç´å°ç¬¬ä¸ä¸ª yield è¯å¥
gen.next(); // 0
gen.next("pretzel"); // 1 pretzel
gen.next("california"); // 2 california
gen.next("mayonnaise"); // 3 mayonnaise
çæå¨ä¸çè¿åè¯å¥
function* yieldAndReturn() {
yield "产ççå¼";
return "è¿åçå¼";
yield "ä¸ä¼è¢«è®¿é®å°çå¼";
}
const gen = yieldAndReturn();
console.log(gen.next()); // { value: "产ççå¼", done: false }
console.log(gen.next()); // { value: "è¿åçå¼", done: true }
console.log(gen.next()); // { value: undefined, done: true }
çæå¨ä½ä¸ºå¯¹è±¡å±æ§
const someObj = {
*generator() {
yield "a";
yield "b";
},
};
const gen = someObj.generator();
console.log(gen.next()); // { value: 'a', done: false }
console.log(gen.next()); // { value: 'b', done: false }
console.log(gen.next()); // { value: undefined, done: true }
çæå¨ä½ä¸ºå¯¹è±¡æ¹æ³
class Foo {
*generator() {
yield 1;
yield 2;
yield 3;
}
}
const f = new Foo();
const gen = f.generator();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: undefined, done: true }
çæå¨ä½ä¸ºè®¡ç®å±æ§
class Foo {
*[Symbol.iterator]() {
yield 1;
yield 2;
}
}
const SomeObj = {
*[Symbol.iterator]() {
yield "a";
yield "b";
},
};
console.log(Array.from(new Foo())); // [ 1, 2 ]
console.log(Array.from(SomeObj)); // [ 'a', 'b' ]
çæå¨æ¯ä¸å¯æé ç
function* f() {}
const obj = new f(); // throws "TypeError: f is not a constructor
使ç¨è¡¨è¾¾å¼å®ä¹çæå¨
const foo = function* () {
yield 10;
yield 20;
};
const bar = foo();
console.log(bar.next()); // {value: 10, done: false}
çæå¨ç¤ºä¾
function* powers(n) {
// æ é循ç¯çæ
for (let current = n; ; current *= n) {
yield current;
}
}
for (const power of powers(2)) {
// æ§å¶çæå¨
if (power > 32) {
break;
}
console.log(power);
// 2
// 4
// 8
// 16
// 32
}
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4