Iterator
åºçº¿
广æ³å¯ç¨
*
èª 2016å¹´9æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
Iterator 对象æ¯ä¸ä¸ªç¬¦åè¿ä»£å¨åè®®ç对象ï¼å
¶æä¾äº next() æ¹æ³ç¨ä»¥è¿åè¿ä»£å¨ç»æå¯¹è±¡ãææå
ç½®è¿ä»£å¨é½ç»§æ¿èª Iterator ç±»ãIterator ç±»æä¾äº [Symbol.iterator]() æ¹æ³ï¼è¯¥æ¹æ³è¿åè¿ä»£å¨å¯¹è±¡æ¬èº«ï¼ä½¿è¿ä»£å¨ä¹å¯è¿ä»£ãå®è¿æä¾äºä¸äºä½¿ç¨è¿ä»£å¨çè¾
婿¹æ³ã
æè¿°
以ä¸é½æ¯å ç½®ç JavaScript è¿ä»£å¨ï¼
- æ°ç»è¿ä»£å¨ï¼è¿åèª
Array.prototype.values()ãArray.prototype.keys()ãArray.prototype.entries()ãArray.prototype[Symbol.iterator]()ãTypedArray.prototype.values()ãTypedArray.prototype.keys()ãTypedArray.prototype.entries()ãTypedArray.prototype[Symbol.iterator]()åarguments[Symbol.iterator]()ã - å符串è¿ä»£å¨ï¼è¿åèª
String.prototype[Symbol.iterator]()ã - Map è¿ä»£å¨ï¼è¿åèª
Map.prototype.values()ãMap.prototype.keys()ãMap.prototype.entries()åMap.prototype[Symbol.iterator]()ã - Set è¿ä»£å¨ï¼è¿åèª
Set.prototype.values()ãSet.prototype.keys()ãSet.prototype.entries()åSet.prototype[Symbol.iterator]()ã - æ£å表达å¼å符串è¿ä»£å¨ï¼è¿åèª
RegExp.prototype[Symbol.matchAll]()åString.prototype.matchAll()ã Generator对象ï¼è¿åèªçæå¨å½æ°ã- Segment è¿ä»£å¨ï¼è¿åèª
Intl.Segmenter.prototype.segment()è¿åçSegments对象ç[Symbol.iterator]()æ¹æ³ã - è¿ä»£å¨è¾
婿¹æ³ï¼è¿åèªè¿ä»£å¨è¾
婿¹æ³ä¾å¦
Iterator.prototype.filter()åIterator.prototype.map()ã
æ¯ä¸ªè¿ä»£å¨é½æä¸ä¸ªä¸åçåå对象ï¼å®å®ä¹äºç¹å®è¿ä»£å¨ä½¿ç¨ç next() æ¹æ³ãä¾å¦ï¼ææå符串è¿ä»£å¨å¯¹è±¡é½ç»§æ¿èªéè对象 StringIteratorPrototypeï¼è¯¥å¯¹è±¡å
·ææç ä½è¿ä»£å½åå符串ç next() æ¹æ³ãStringIteratorPrototype è¿æä¸ä¸ª [Symbol.toStringTag] 屿§ï¼å
¶åå§å¼ä¸ºå符串 "String Iterator"ãè¯¥å±æ§å¨ Object.prototype.toString() ä¸ä½¿ç¨ã类似å°ï¼å
¶ä»è¿ä»£å¨åå乿èªå·±ç [Symbol.toStringTag] å¼ï¼è¿äºå¼ä¸ä¸é¢ç»åºçåç§°ç¸åã
ææè¿äºåå对象é½ç»§æ¿èª Iterator.prototypeï¼å®æä¾äºä¸ä¸ªè¿åè¿ä»£å¨å¯¹è±¡æ¬èº«ç [Symbol.iterator]() æ¹æ³ï¼è¿ä½¿è¿ä»£å¨ä¹åå¾å¯è¿ä»£ã
è¿ä»£å¨è¾ 婿¹æ³
夿³¨ï¼è¿äºæ¹æ³æ¯è¿ä»£å¨è¾
婿¹æ³ï¼è䏿¯å¯è¿ä»£å¯¹è±¡è¾
婿¹æ³ï¼å 为å¯è¿ä»£å¯¹è±¡çå¯ä¸è¦æ±å°±æ¯å
·æ [Symbol.iterator]() æ¹æ³ï¼å æ¤å®ä»¬æ²¡æå
±äº«çå忥å®è£
è¿äºæ¹æ³ã
Iterator ç±»æ¬èº«æä¾äºä¸äºä½¿ç¨è¿ä»£å¨çè¾
婿¹æ³ãä¾å¦ï¼ä½ å¯è½æ³å以ä¸äºæ
ï¼
const nameToDeposit = new Map([
["Anne", 1000],
["Bert", 1500],
["Carl", 2000],
]);
const totalDeposit = [...nameToDeposit.values()].reduce((a, b) => a + b);
è¿é¦å
å° Map.prototype.values() è¿åçè¿ä»£å¨å¨è½¬æ¢ä¸ºæ°ç»ï¼ç¶åä½¿ç¨ Array.prototype.reduce() æ¹æ³è®¡ç®æ»åãç¶èï¼è¿æ¢å建äºä¸ä¸ªä¸é´æ°ç»ï¼åéå¤äºæ°ç»ä¸¤æ¬¡ãç¸åï¼ä½ å¯ä»¥ä½¿ç¨è¿ä»£å¨æ¬èº«ç reduce() æ¹æ³ï¼
const totalDeposit = nameToDeposit.values().reduce((a, b) => a + b);
è¿ç§æ¹æ³æ´å 髿ï¼å 为å®åªè¿ä»£è¿ä»£å¨ä¸æ¬¡ï¼èä¸éè¦ä¿åä»»ä½ä¸é´å¼ãè¿ä»£å¨è¾ 婿¹æ³å¯¹äºä½¿ç¨æ éè¿ä»£å¨æ¯å¿ éçï¼
function* fibonacci() {
let current = 1;
let next = 1;
while (true) {
yield current;
[current, next] = [next, current + next];
}
}
const seq = fibonacci();
const firstThreeDigitTerm = seq.find((n) => n >= 100);
ä½ æ æ³å° seq 转æ¢ä¸ºæ°ç»ï¼å ä¸ºå®æ¯æ ç©·çãç¸åï¼ä½ å¯ä»¥ä½¿ç¨è¿ä»£å¨æ¬èº«ç find() æ¹æ³ï¼è¯¥æ¹æ³ä»
éè¦è¿ä»£ seq æ¥æ¾æ»¡è¶³æ¡ä»¶ç第ä¸ä¸ªå¼ã
ä½ ä¼åç°è®¸å¤è¿ä»£å¨æ¹æ³ç±»ä¼¼äºæ°ç»æ¹æ³ï¼ä¾å¦ï¼
Iterator.prototype.drop() å Iterator.prototype.take() ç»åèµ·æ¥æç¹ç±»ä¼¼äº Array.prototype.slice()ã
å¨è¿äºæ¹æ³ä¸ï¼filter()ãflatMap()ãmap()ãdrop() å take() è¿åä¸ä¸ªæ°çè¿ä»£å¨è¾
婿¹æ³å¯¹è±¡ãè¿ä»£å¨è¾
婿¹æ³ä¹æ¯ä¸ä¸ª Iterator å®ä¾ï¼ä½¿è¾
婿¹æ³å¯é¾å¼è°ç¨ãææè¿ä»£å¨è¾
婿¹æ³å¯¹è±¡é½ç»§æ¿äºä¸ä¸ªéç¨çåå对象ï¼è¯¥å¯¹è±¡å®ç°äºè¿ä»£å¨åè®®ï¼
next()-
è°ç¨åºå±è¿ä»£å¨ç
next()æ¹æ³ï¼å°è¾ 婿¹æ³åºç¨äºç»æï¼å¹¶è¿åç»æã return()-
è°ç¨åºå±è¿ä»£å¨ç
return()æ¹æ³ï¼å¹¶è¿åç»æã
è¿ä»£å¨è¾ 婿¹æ³ä¸åºå±è¿ä»£å¨å ±äº«ç¸åçæ°æ®æºï¼å æ¤è¿ä»£è¿ä»£å¨è¾ 婿¹æ³ä¼å¯¼è´åºå±è¿ä»£å¨ä¹è¢«è¿ä»£ã没æåæ³âå¤å»âè¿ä»£å¨ä»¥å 许å®è¢«å¤æ¬¡è¿ä»£ã
const it = [1, 2, 3].values();
const it2 = it.drop(0); // æ¬è´¨ä¸æ¯ä¸ä¸ªå¯æ¬
console.log(it.next().value); // 1
console.log(it2.next().value); // 2
console.log(it.next().value); // 3
æ°å½çè¿ä»£å¨
æä¸¤ç§âè¿ä»£å¨âï¼ç¬¦åè¿ä»£å¨åè®®ï¼å¿
éä¸åªéå
·æ next() æ¹æ³ï¼ç对象ï¼ä»¥åç»§æ¿èª Iterator ç±»ç对象ï¼åè
å¯ä»¥ä½¿ç¨è¾
婿¹æ³ã两è
äºä¸å
å«ââç»§æ¿èª Iterator ç对象ä¸ä¼èªå¨åæè¿ä»£å¨ï¼å 为 Iterator 类并æªå®ä¹ next() æ¹æ³ãç¸åï¼è¿äºå¯¹è±¡éè¦èªå·±å®ä¹ next() æ¹æ³ãæ°å½çè¿ä»£å¨æçæ¯å³ç¬¦åè¿ä»£å¨åè®®ï¼åæ¶åç»§æ¿èª Iterator çè¿ä»£å¨ã大夿°ä»£ç æææçè¿ä»£å¨é½æ¯æ°å½çè¿ä»£å¨å¹¶å¯ä»¥éè¿è¿ä»£è¿åæ°å½çè¿ä»£å¨ãè¦å建æ°å½çè¿ä»£å¨ï¼å¯ä»¥å®ä¹ä¸ä¸ªç»§æ¿ Iterator çç±»ï¼æä½¿ç¨ Iterator.from() æ¹æ³ã
class MyIterator extends Iterator {
next() {
// â¦
}
}
const myIterator = Iterator.from({
next() {
// â¦
},
});
æé 彿°
Iterator()- ï¼æ¨å¨è¢«å建è¿ä»£å¨çå ¶ä»ç±»ç»§æ¿ãç´æ¥ç¨äºæå»ºä¼æåºé误ã
éææ¹æ³
Iterator.from()-
ä»ä¸ä¸ªè¿ä»£å¨æå¯è¿ä»£å¯¹è±¡å建ä¸ä¸ªæ°ç
Iterator对象ã
å®ä¾å±æ§
è¿äºå±æ§å®ä¹äº Iterator.prototype å¹¶ç±ææ Iterator å®ä¾æå
±äº«ã
Iterator.prototype.constructor-
å建å®ä¾å¯¹è±¡çæé 彿°ã对äº
Iteratorå®ä¾ï¼å ¶åå§å¼æ¯Iteratoræé 彿°ã Iterator.prototype[Symbol.toStringTag]-
[Symbol.toStringTag]屿§çåå§å¼æ¯å符串"Iterator"ãè¯¥å±æ§å¨Object.prototype.toString()ä¸ä½¿ç¨ã夿³¨ï¼ä¸å¤§å¤æ°å 置类ç
[Symbol.toStringTag]ä¸åï¼åºäº web å ¼å®¹æ§åå ï¼Iterator.prototype[Symbol.toStringTag]æ¯å¯åçã
å®ä¾æ¹æ³
Iterator.prototype.drop()-
è¿åä¸ä¸ªæ°çè¿ä»£å¨è¾ 婿¹æ³ï¼å ¶ä¼è·³è¿å½åè¿ä»£å¨å¼å¤´ç»å®æ°éçå ç´ ã
Iterator.prototype.every()-
æµè¯æ¯å¦ææç±è¿ä»£å¨äº§ççå ç´ é½è½éè¿ç±æä¾ç彿°å®ç°çæµè¯ã
Iterator.prototype.filter()-
è¿åä¸ä¸ªæ°çè¿ä»£å¨è¾ 婿¹æ³ï¼å ¶åªäº§çè¿ä»£å¨ä¸ä»¤æä¾çåè°å½æ°è¿å
trueçé£äºå ç´ ã Iterator.prototype.find()-
è¿åè¿ä»£å¨äº§çç第ä¸ä¸ªæ»¡è¶³æä¾çæµè¯å½æ°çå ç´ ãå¦ææ²¡ææ»¡è¶³æµè¯å½æ°çå¼ï¼åè¿å
undefinedã Iterator.prototype.flatMap()-
è¿åä¸ä¸ªæ°çè¿ä»£å¨è¾ 婿¹æ³ï¼å ¶è·ååå§è¿ä»£å¨ä¸çæ¯ä¸ªå ç´ ï¼éè¿æ å°å½æ°è¿è¡æ å°ï¼å¹¶äº§çæ å°å½æ°è¿åçå ç´ ï¼å å«å¨å¦ä¸ä¸ªè¿ä»£å¨æå¯è¿ä»£å¯¹è±¡ï¼ã
Iterator.prototype.forEach()-
为è¿ä»£å¨çæçæ¯ä¸ªå ç´ æ§è¡ä¸æ¬¡æä¾ç彿°ã
Iterator.prototype.map()-
è¿åä¸ä¸ªæ°çè¿ä»£å¨è¾ 婿¹æ³ï¼å ¶çæçå ç´ é½ç±æ å°å½æ°è¿è¡è½¬æ¢èæ¥ã
Iterator.prototype.reduce()-
对è¿ä»£å¨çæçæ¯ä¸ªå ç´ æ§è¡ç¨æ·æä¾çâreducerâåè°å½æ°ï¼ä¼ å ¥åä¸ä¸ªå ç´ è®¡ç®çè¿åå¼ã卿æå ç´ ä¸è¿è¡ reducer çæç»ç»ææ¯å个å¼ã
Iterator.prototype.some()-
æµè¯è¿ä»£å¨ä¸æ¯å¦è³å°æä¸ä¸ªè½å¤çå ç´ éè¿ç±æä¾ç彿°å®ç°çæµè¯ãè¿åä¸ä¸ªå¸å°å¼ã
Iterator.prototype.take()-
è¿åä¸ä¸ªæ°çè¿ä»£å¨å¸®å©æ¹æ³ï¼å®çæå½åè¿ä»£å¨ä¸ç»å®æ°éçå ç´ ï¼ç¶åç»æã
Iterator.prototype.toArray()-
å建ä¸ä¸ªç¨è¿ä»£å¨äº§ççå ç´ å¡«å çæ°ç
Arrayå®ä¾ã Iterator.prototype[Symbol.iterator]()-
è¿åè¿ä»£å¨å¯¹è±¡æ¬èº«ãè¿ä½¿è¿ä»£å¨å¯¹è±¡ä¹æ¯å¯è¿ä»£çã
示ä¾
>使ç¨è¿ä»£å¨ä½ä¸ºå¯è¿ä»£å¯¹è±¡
ææå
ç½®è¿ä»£å¨é½æ¯å¯è¿ä»£çï¼å æ¤ä½ å¯ä»¥å¨ for...of 循ç¯ä¸ä½¿ç¨å®ä»¬ï¼
const arrIterator = [1, 2, 3].values();
for (const value of arrIterator) {
console.log(value);
}
// æå°ï¼1, 2, 3
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-%iteratorprototype%-object> |