è¿ä»£å¨åçæå¨å°è¿ä»£çæ¦å¿µç´æ¥å¸¦å
¥æ ¸å¿è¯è¨ï¼å¹¶æä¾äºä¸ç§æºå¶æ¥èªå®ä¹ for...of
循ç¯çè¡ä¸ºã
è¥æ³äºè§£æ´å¤è¯¦æ ï¼è¯·åèï¼
è¿ä»£å¨å¨ JavaScript ä¸ï¼è¿ä»£å¨æ¯ä¸ä¸ªå¯¹è±¡ï¼å®å®ä¹ä¸ä¸ªåºåï¼å¹¶å¨ç»æ¢æ¶å¯è½é带ä¸ä¸ªè¿åå¼ã
æ´å
·ä½å°è¯´ï¼è¿ä»£å¨æ¯éè¿ä½¿ç¨ next()
æ¹æ³å®ç°äºè¿ä»£å¨åè®®çä»»ä½ä¸ä¸ªå¯¹è±¡ï¼è¯¥æ¹æ³è¿åå
·æä¸¤ä¸ªå±æ§ç对象ï¼
value
è¿ä»£åºåçä¸ä¸ä¸ªå¼ã
done
妿已ç»è¿ä»£å°åºåä¸çæåä¸ä¸ªå¼ï¼åå®ä¸º true
ã妿 value
å done
ä¸èµ·åºç°ï¼åå®å°±æ¯è¿ä»£å¨çè¿åå¼ã
䏿¦å建ï¼è¿ä»£å¨å¯¹è±¡å¯ä»¥éè¿éå¤è°ç¨ next()
æ¾å¼å°è¿ä»£ãè¿ä»£ä¸ä¸ªè¿ä»£å¨è¢«ç§°ä¸ºæ¶èäºè¿ä¸ªè¿ä»£å¨ï¼å 为å®é常åªè½æ§è¡ä¸æ¬¡ï¼å¨äº§çç»å¼åï¼å¯¹ next()
çé¢å¤è°ç¨åºè¯¥ç»§ç»è¿å {doneï¼true}
ã
Javascript 䏿叏è§çè¿ä»£å¨æ¯æ°ç»è¿ä»£å¨ï¼å®æé¡ºåºè¿åå ³èæ°ç»ä¸çæ¯ä¸ªå¼ã
è½ç¶å¾å®¹ææ³è±¡ææè¿ä»£å¨é½å¯ä»¥è¡¨ç¤ºä¸ºæ°ç»ï¼ä½äºå®å¹¶é妿¤ãæ°ç»å¿
须宿´åé
ï¼èè¿ä»£å¨åæ¯æéåé
ãå æ¤ï¼è¿ä»£å¨å¯ä»¥è¡¨ç¤ºæ é大å°çåºåï¼ä¾å¦ 0 å Infinity
ä¹é´çæ´æ°èå´ã
ä¸é¢çä¾åå±ç¤ºäºå
·ä½åæ³ãå®å
è®¸ä½ å建ä¸ä¸ªç®åçèå´è¿ä»£å¨ï¼ä»¥å®ä¹ä¸ä¸ªä» start
ï¼éï¼å° end
ï¼å¼ï¼ï¼ä»¥ step
为æ¥é¿çæ´æ°åºåãå®çæç»è¿å弿¯å®å建çåºåç大å°ï¼ç±åé iterationCount
è·è¸ªã
function makeRangeIterator(start = 0, end = Infinity, step = 1) {
let nextIndex = start;
let iterationCount = 0;
const rangeIterator = {
next() {
let result;
if (nextIndex < end) {
result = { value: nextIndex, done: false };
nextIndex += step;
iterationCount++;
return result;
}
return { value: iterationCount, done: true };
},
};
return rangeIterator;
}
使ç¨è¿ä¸ªè¿ä»£å¨çèµ·æ¥åè¿æ ·ï¼
let it = makeRangeIterator(1, 10, 2);
let result = it.next();
while (!result.done) {
console.log(result.value); // 1 3 5 7 9
result = it.next();
}
console.log(`å·²è¿ä»£åºåç大å°ï¼${result.value}`); // 5
夿³¨ï¼ åå°æ§å°ç¥éç¹å®å¯¹è±¡æ¯å¦æ¯è¿ä»£å¨æ¯ä¸å¯è½çãå¦æä½ éè¦è¿æ ·åï¼è¯·ä½¿ç¨å¯è¿ä»£å¯¹è±¡ã
çæå¨å½æ°è½ç¶èªå®ä¹è¿ä»£å¨æ¯ä¸ä¸ªæç¨çå·¥å
·ï¼ä½ç±äºéè¦æ¾å¼å°ç»´æ¤å
¶å
é¨ç¶æï¼å æ¤å建æ¶è¦æ ¼å¤è°¨æ
ãçæå¨å½æ°ï¼Generator 彿°ï¼æä¾äºä¸ä¸ªå¼ºå¤§çæ¿ä»£éæ©ï¼å®å
è®¸ä½ å®ä¹ä¸ä¸ªéè¿ç»æ§è¡ç彿°ä½ä¸ºè¿ä»£ç®æ³ãçæå¨å½æ°ä½¿ç¨ function*
è¯æ³ç¼åã
æåè°ç¨æ¶ï¼çæå¨å½æ°ä¸æ§è¡ä»»ä½ä»£ç ï¼èæ¯è¿åä¸ç§ç§°ä¸ºçæå¨çç¹æ®è¿ä»£å¨ãéè¿è°ç¨ next()
æ¹æ³æ¶è该çæå¨æ¶ï¼çæå¨å½æ°å°æ§è¡ï¼ç´è³éå° yield
å
³é®åã
å¯ä»¥æ ¹æ®éè¦å¤æ¬¡è°ç¨è¯¥å½æ°ï¼å¹¶ä¸æ¯æ¬¡é½è¿åä¸ä¸ªæ°ççæå¨ï¼ä½æ¯ä¸ªçæå¨åªè½è¿ä»£ä¸æ¬¡ã
æä»¬ç°å¨å¯ä»¥è°æ´ä¸é¢çä¾åäºãæ¤ä»£ç çè¡ä¸ºå¹¶æ²¡ææ¹åï¼ä½æ´å®¹æç¼ååé 读ã
function* makeRangeIterator(start = 0, end = Infinity, step = 1) {
let iterationCount = 0;
for (let i = start; i < end; i += step) {
iterationCount++;
yield i;
}
return iterationCount;
}
å¯è¿ä»£å¯¹è±¡
è¥ä¸ä¸ªå¯¹è±¡æ¥æè¿ä»£è¡ä¸ºï¼æ¯å¦å¨ for...of
ä¸ä¼å¾ªç¯ä¸äºå¼ï¼é£ä¹é£ä¸ªå¯¹è±¡ä¾¿æ¯ä¸ä¸ªå¯è¿ä»£å¯¹è±¡ãä¸äºå
置类åï¼å¦ Array
æ Map
æ¥æé»è®¤çè¿ä»£è¡ä¸ºï¼èå
¶ä»ç±»åï¼æ¯å¦ Object
ï¼å没æã
为äºå®ç°å¯è¿ä»£ï¼å¯¹è±¡å¿
é¡»å®ç° [Symbol.iterator]()
æ¹æ³ï¼è¿æå³çè¿ä¸ªå¯¹è±¡ï¼æå
¶ååé¾ä¸çä»»æä¸ä¸ªå¯¹è±¡ï¼å¿
é¡»å
·æä¸ä¸ªé®å¼ä¸º Symbol.iterator
ç屿§ã
ç¨åºååºç¥éä¸ä¸ªå¯è¿ä»£å¯¹è±¡å¯ä»¥å¤æ¬¡è¿ä»£ï¼è¿æ¯åªè½è¿ä»£ä¸æ¬¡ã
åªè½è¿ä»£ä¸æ¬¡çå¯è¿ä»£å¯¹è±¡ï¼ä¾å¦çæå¨ï¼é常ä»å®ä»¬ç [Symbol.iterator]()
æ¹æ³ä¸è¿å this
ï¼èé£äºå¯ä»¥å¤æ¬¡è¿ä»£çæ¹æ³å¿
须卿¯æ¬¡è°ç¨ [Symbol.iterator]()
æ¶è¿åä¸ä¸ªæ°çè¿ä»£å¨ã
function* makeIterator() {
yield 1;
yield 2;
}
const it = makeIterator();
for (const itItem of it) {
console.log(itItem);
}
console.log(it[Symbol.iterator]() === it); // true
// è¿ä¸ªä¾ååæä»¬å±ç¤ºäºçæå¨ï¼è¿ä»£å¨ï¼æ¯å¯è¿ä»£å¯¹è±¡ï¼
// 宿ä¸ä¸ª [Symbol.iterator]() æ¹æ³è¿å itï¼å®èªå·±ï¼ï¼
// å æ¤ï¼it 对象åªè½è¿ä»£*䏿¬¡*ã
// 妿æä»¬å°å®ç [Symbol.iterator]() æ¹æ³æ¹ä¸ºä¸ä¸ªè¿åæ°çè¿ä»£å¨/çæå¨å¯¹è±¡ç彿°/çæå¨ï¼
// å®ï¼itï¼å°±å¯ä»¥è¿ä»£å¤æ¬¡äºã
it[Symbol.iterator] = function* () {
yield 2;
yield 1;
};
èªå®ä¹çå¯è¿ä»£å¯¹è±¡
æä»¬å¯ä»¥åè¿æ ·å®ç°èªå·±çå¯è¿ä»£å¯¹è±¡ï¼
var myIterable = {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
},
};
èªå®ä¹çå¯è¿ä»£å¯¹è±¡å¯ç¨ for...of
å¾ªç¯æè
å±å¼è¯æ³è¿è¡è¿ä»£ã
for (let value of myIterable) {
console.log(value);
}
// 1
// 2
// 3
[...myIterable]; // [1, 2, 3]
å
ç½®å¯è¿ä»£å¯¹è±¡
String
ãArray
ãTypedArray
ãMap
å Set
齿¯å
ç½®å¯è¿ä»£å¯¹è±¡ï¼å 为å®ä»¬çååå¯¹è±¡é½æ¥æä¸ä¸ª Symbol.iterator
æ¹æ³ã
ä¸äºè¯å¥å表达å¼ä¸ç¨äºå¯è¿ä»£å¯¹è±¡ï¼ä¾å¦ for...of
循ç¯ãå±å¼è¯æ³ãyield*
åè§£æè¯æ³ã
for (let value of ["a", "b", "c"]) {
console.log(value);
}
// "a"
// "b"
// "c"
[..."abc"]; // ["a", "b", "c"]
function* gen() {
yield* ["a", "b", "c"];
}
gen().next(); // { value: "a", done: false }
[a, b, c] = new Set(["a", "b", "c"]);
a; // "a"
é«çº§çæå¨
çæå¨ä¼æé计ç®å®ä»¬ yield
çå¼ï¼è¿ä½¿å¾å®ä»¬è½å¤é«æå°è¡¨ç¤ºä¸ä¸ªè®¡ç®ææ¬å¾é«çåºåï¼çè³æ¯åææç¤ºçä¸ä¸ªæ éåºåã
next()
æ¹æ³ä¹æ¥åä¸ä¸ªåæ°ç¨äºä¿®æ¹çæå¨å
é¨ç¶æãä¼ éç» next()
çåæ°å¼ä¼è¢« yield
æ¥æ¶ã
夿³¨ï¼ ä¼ ç»ç¬¬ä¸ä¸ª next()
çå¼ä¼è¢«å¿½ç¥ã
ä¸é¢çæ¯ææ³¢é£å¥æ°åçæå¨ï¼å®ä½¿ç¨äº next(x)
æ¥éå¯åºåï¼
function* fibonacci() {
let current = 0;
let next = 1;
while (true) {
const reset = yield current;
[current, next] = [next, next + current];
if (reset) {
current = 0;
next = 1;
}
}
}
const sequence = fibonacci();
console.log(sequence.next().value); // 0
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 2
console.log(sequence.next().value); // 3
console.log(sequence.next().value); // 5
console.log(sequence.next().value); // 8
console.log(sequence.next(true).value); // 0
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 2
ä½ å¯ä»¥éè¿è°ç¨å
¶ throw()
æ¹æ³å¼ºå¶çæå¨æåºå¼å¸¸ï¼å¹¶ä¼ éåºè¯¥æåºçå¼å¸¸å¼ãè¿ä¸ªå¼å¸¸å°ä»å½åæèµ·ççæå¨çä¸ä¸æä¸æåºï¼å°±å¥½åå½åæèµ·ç yield
æ¯ä¸ä¸ª throw value
è¯å¥ã
å¦æè¯¥å¼å¸¸æ²¡æå¨çæå¨å
é¨è¢«æè·ï¼åå®å°éè¿ throw()
çè°ç¨åä¸ä¼ æï¼å¯¹ next()
çåç»è°ç¨å°å¯¼è´ done
屿§ä¸º true
ã
çæå¨ç return()
æ¹æ³å¯è¿åç»å®çå¼å¹¶ç»ç»è¿ä¸ªçæå¨ã
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