컬ë ì
ë´ ê° í목 ì²ë¦¬ë ë§¤ì° íí ì°ì°ì
ëë¤. JavaScriptë ê°ë¨í for
루íìì map()
ë° filter()
ì ì´ë¥´ê¸°ê¹ì§, 컬ë ì
ì ë°ë³µíë ë§ì ë°©ë²ì ì ê³µí©ëë¤. ë°ë³µê¸°(iterator) ë° ìì±ê¸°(generator)ë ë°ë³µ ê°ë
ì íµì¬ ì¸ì´ ë´ë¡ ë°ë¡ ê°ì ¸ì for...of
루íì ëì(behavior)ì ì¬ì©ì ì ìíë ë©ì»¤ëì¦ì ì ê³µí©ëë¤.
ìì¸í ë´ì©ì, ë¤ìì 참조íì¸ì:
ë°ë³µìJavaScriptìì ë°ë³µì(Iterator)ë ìíì¤ë¥¼ ì ìíê³ ì¢
ë£ìì ë°íê°ì ì ì¬ì ì¼ë¡ ì ìíë ê°ì²´ì
ëë¤. ë 구체ì ì¼ë¡ ë§íìë©´, ë°ë³µìë ë ê°ì ìì±( value
, done
)ì ë°ííë next() ë©ìë ì¬ì©íì¬ ê°ì²´ì Iterator protocolì 구íí©ëë¤. ìíì¤ì ë§ì§ë§ ê°ì´ ì´ë¯¸ ì°ì¶ëìë¤ë©´ done
ê°ì true ê° ë©ëë¤. ë§ì½ value
ê°ì´ done
ê³¼ í¨ê» ì¡´ì¬íë¤ë©´, ê·¸ê²ì ë°ë³µìì ë°íê°ì´ ë©ëë¤.
ë°ë³µì를 ìì±íë©´ next()
ë©ìë를 ë°ë³µì ì¼ë¡ í¸ì¶íì¬ ëª
ìì ì¼ë¡ ë°ë³µìí¬ ì ììµëë¤. ë°ë³µì를 ë°ë³µìí¤ë ê²ì ì¼ë°ì ì¼ë¡ í ë²ì©ë§ í ì ì기 ë문ì, ë°ë³µì를 ì모ìí¤ë ê²ì´ë¼ê³ í ì ììµëë¤. ë§ì§ë§ ê°ì ì°ì¶íê³ ëì next()
를 ì¶ê°ì ì¼ë¡ í¸ì¶íë©´ {done: true}
. ê° ë°íë©ëë¤.
JavaScriptìì ê°ì¥ ì¼ë°ì ì¸ ë°ë³µìë ë°°ì´ ë°ë³µìë¡, ë°°ì´ì ê° ê°ì ììëë¡ ë°íí©ëë¤. 모ë ë°ë³µìê° ë°°ì´ë¡ ííë ì ìë¤ê³ ììí ì ìì§ë§ , ì´ê²ì ì¬ì¤ì ìëëë¤. ë°°ì´ì ìì í í ë¹ëì´ì¼ íì§ë§, ë°ë³µìë íìíë§í¼ë§ ì모ëë¯ë¡ 무ì í ìíì¤ë¡ ííí ì ììµëë¤. ì´ë¥¼ í ë©´ 0ë¶í° 무íëì¬ì´ì ì ìë²ìì²ë¼ ë§ì´ì£ .
ì¬ê¸°ì ì¤ìµí ì ìë ìì ê° ììµëë¤. start
ìì end
ê¹ì§ step
ì ë§í¼ ëì´ì§ ì ì ìíì¤ë¥¼ ì ìíë ê°ë¨í ë²ì ë°ë³µì를 ë§ë¤ ì ììµëë¤. ìµì¢
ì ì¼ë¡ ìíì¤ì í¬ê¸°ê° ë°íë©ëë¤.
function makeRangeIterator(start = 0, end = Infinity, step = 1) {
var nextIndex = start;
var n = 0;
var rangeIterator = {
next: function () {
var result;
if (nextIndex < end) {
result = { value: nextIndex, done: false };
} else if (nextIndex == end) {
result = { value: n, done: true };
} else {
result = { done: true };
}
nextIndex += step;
n++;
return result;
},
};
return rangeIterator;
}
ìì ë°ë³µì를 ì¬ì©íë©´ ìëì ê°ìµëë¤:
var it = makeRangeIterator(1, 4);
var result = it.next();
while (!result.done) {
console.log(result.value); // 1 2 3
result = it.next();
}
console.log("Iterated over sequence of size: ", result.value);
It is not possible to know reflectively whether a particular object is an iterator. If you need to do this, use Iterables.
Generator functionsì ë§ë¤ì´ì§ ë°ë³µì(Iterator)ë ì ì©í ëêµ¬ì¸ ë°ë©´, ì´ê²ì ìì±í ëë 주ìí´ì íë¡ê·¸ëë°ì í´ì¼ íëë°, ë°ë³µì ë´ë¶ì ëª
ìì ì¼ë¡ ìí를 ì ì§í íìê° ì기 ë문ì
ëë¤. ìì±ì(Generator) í¨ìë ì´ì ëí ê°ë ¥í ëìì ì ê³µí©ëë¤: ì¤íì´ ì°ìì ì´ì§ ìì íëì í¨ì를 ìì±í¨ì¼ë¡ì ê°ë°ìê° iterative algorithmì ì ìí ì ìê² í´ì¤ëë¤. ìì±ì í¨ìë function*
문ë²ì ì¬ì©íì¬ ìì±ë©ëë¤. ìì±ì í¨ìê° ìµì´ë¡ í¸ì¶ë ë, í¨ì ë´ë¶ì ì´ë í ì½ëë ì¤íëì§ ìê³ , ëì ìì±ìë¼ê³ ë¶ë¦¬ë ë°ë³µì íì
ì ë°íí©ëë¤. ìì±ìì next ë©ìë를 í¸ì¶í¨ì¼ë¡ì ì´ë¤ ê°ì´ ìë¹ëë©´, ìì±ì í¨ìë yield í¤ìë를 ë§ë ëê¹ì§ ì¤íë©ëë¤.
ìì±ì í¨ìë ìíë ë§í¼ í¸ì¶ë ì ìê³ , ë§¤ë² ìë¡ì´ ìì±ì를 ë°íí©ëë¤ë¤. íì§ë§, ê° ìì±ìë ë¨ í ë²ë§ ìíë ì ìì ê²ì ëë¤.
ìì ìì ì½ëì ìì±ì를 ì ì©í ê²ì ëë¤. ë ì½ëì íìë ëì¼íì§ë§, ìì±ì를 ì¬ì©í ìª½ì´ ì°ê±°ë ì½ê¸°ê° í¨ì¬ ì½ìµëë¤.
function* makeRangeIterator(start = 0, end = Infinity, step = 1) {
let n = 0;
for (let i = start; i < end; i += step) {
n++;
yield i;
}
return n;
}
Iterables
ê°ì²´ë ê°ì´ for..of
구조 ë´ìì ë°ë³µëë ê² ê°ì ê·¸ ë°ë³µ ëìì ì ìíë ê²½ì° ë°ë³µì´ ê°ë¥(iterable)í©ëë¤. Array
ëë Map
ê³¼ ê°ì ì¼ë¶ ë´ì¥ íì 기본 ë°ë³µ ëìì´ ìì§ë§ ë¤ë¥¸ í(ê°ë ¹ Object
)ì ììµëë¤.
ë°ë³µê°ë¥í기 ìí´ì, ê°ì²´ë @@iterator ë©ìë를 구íí´ì¼ í©ëë¤. ì¦, ê°ì²´( í¹ì ê·¸ íë¡í íì
ì²´ì¸ì ë±ì¥íë ê°ì²´ ì¤ íë)ê° Symbol.iterator
í¤ë¥¼ ê°ë ìì±ì´ ìì´ì¼ í¨ì ë»í©ëë¤.
íëì iterableì ë¨ í ë², í¹ì ì¬ë¬ë² ë°ë³µê°ë¥í©ëë¤. ì´ë¤ ìê°ì ì´ë»ê² ì¬ì©í ì§ë íë¡ê·¸ë머ìê² ë¬ë ¤ììµëë¤. ë¨ í ë² ë°ë³µê°ë¥í iterable(e.g. Generator)ì ê´ìµì ì¼ë¡ ìì ì @@iterator ë©ìëë¡ë¶í° this를 ë°íí©ëë¤. ë°ë©´, ì¬ë¬ ë² ë°ë³µ ê°ë¥í iterablesì @@iterator ë©ìëê° í¸ì¶ëë 매 í ìë¡ì´ iterator를 ë°ëì ë°íí´ì¼í©ëë¤.
ì¬ì©ì ì ì iterableì´ì ê°ì´ ìì ì ë°ë³µê°ë¥ ê°ì²´ë¥¼ ë§ë¤ ì ììµëë¤:
var myIterable = {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
}
}
for (let value of myIterable) {
console.log(value);
}
// 1
// 2
// 3
or
[...myIterable]; // [1, 2, 3]
ë´ì¥ iterable
String
, Array
, TypedArray
, Map
ë° Set
ì 모ë ë´ì¥ ë°ë³µê°ë¥ ê°ì²´ì
ëë¤, ê·¸ë¤ì íë¡í íì
ê°ì²´ê° 모ë Symbol.iterator
ë©ìëê° ì기 ë문ì
ëë¤.
ì¼ë¶ 문(statement) ë° ì(expression)ì iterableí©ëë¤, ê°ë ¹ for-of
루í, spread syntax, 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"
Generator ì¬í
ìì±ì í¨ìë ìì²ì ë°ë¼ ê·¸ ì°ì¶ë(yielded, yield ìì¼ë¡ ì°ì¶ë) ê°ì ê³ì°íê³ , ê³ì°í기 ë¹ì¼(íë ) ìì´ ëë ìì ì¤ëª í ëë¡ ë¬´í ìì´ì´ë¼ë í¨ì¨ì ì¼ë¡ ëíë´ê² í©ëë¤.
next()
ë©ìëë ëí ìì±ê¸°ì ë´ë¶ ìí를 ìì íë ë° ì°ì¼ ì ìë ê°ì ë°ìµëë¤. next()
ì ì ë¬ëë ê°ì ìì±ê¸°ê° ì¤ë¨ë ë§ì§ë§ yield
ìì ê²°ê³¼ë¡ ì²ë¦¬ë©ëë¤.
ì¬ê¸° sequence(ìì´)ì ì¬ììí기 ìí´ next(x)
를 ì¬ì©íë í¼ë³´ëì¹ ìì±ê¸°ê° ììµëë¤:
function* fibonacci() {
var fn1 = 0;
var fn2 = 1;
while (true) {
var current = fn1;
fn1 = fn2;
fn2 = current + fn1;
var reset = yield current;
if (reset) {
fn1 = 0;
fn2 = 1;
}
}
}
var 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()
ë©ìë를 í¸ì¶íê³ throwí´ì¼ íë ìì¸ ê°ì ì ë¬íì¬ ìì±ìê° ìì¸ë¥¼ throwíëë¡ í ì ììµëë¤. ì´ ìì¸ë ìì±ê¸°ì íì¬ ì¼ì ì¤ë¨ë 컨í
ì¤í¸ìì throwë©ëë¤. ë§ì¹ íì¬ ì¼ì ì¤ë¨ë yield
ê° ëì throwvalue
ë¬¸ì¸ ê²ì²ë¼ ë§ì
ëë¤.
ìì¸ê° ìì±ê¸° ë´ìì í¬ì°©ëì§ ìì¼ë©´ throw()
í¸ì¶ì íµí´ ì íëê³ ì´íì next()
í¸ì¶ì done
ìì±ì´ true
ê° ë©ëë¤.
ì ëë ì´í°ìë 주ì´ì§ ê°ì ë°ííê³ ì ëë ì´í° ì체를 ìë£íë return(value)
ë©ìëê° ììµëë¤.
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