ë°ë³µ ê°ë¥í(iterable, ì´í°ë¬ë¸) ê°ì²´ë ë°°ì´ì ì¼ë°íí ê°ì²´ì
ëë¤. ì´í°ë¬ë¸ ì´ë¼ë ê°ë
ì ì¬ì©íë©´ ì´ë¤ ê°ì²´ìë for..of ë°ë³µë¬¸ì ì ì©í ì ììµëë¤.
ë°°ì´ì ëíì ì¸ ì´í°ë¬ë¸ì ëë¤. ë°°ì´ ì¸ìë ë¤ìì ë´ì¥ ê°ì²´ê° ë°ë³µ ê°ë¥í©ëë¤. 문ìì´ ìì ì´í°ë¬ë¸ì ìì ëë¤.
ë°°ì´ì´ ìë ê°ì²´ê° ìëë°, ì´ ê°ì²´ê° ì´ë¤ ê²ë¤ì 컬ë ì
(목ë¡, ì§í© ë±)ì ëíë´ê³ ìë ê²½ì°, for..of 문ë²ì ì ì©í ìë§ ìë¤ë©´ 컬ë ì
ì ìííëë° ì ì©í ê²ëë¤. ì´ê² ê°ë¥íëë¡ í´ë´
ìë¤.
Symbol.iterator
ì§ì ì´í°ë¬ë¸ ê°ì²´ë¥¼ ë§ë¤ì´ ì´í°ë¬ë¸ì´ë¼ë ê°ë ì ì´í´í´ ë³´ëë¡ í©ìë¤.
for..of를 ì ì©í기ì ì í©í´ ë³´ì´ë ë°°ì´ì´ ìë ê°ì²´ë¥¼ ë§ë¤ê² ìµëë¤.
ììì ê°ì²´ rangeë ì«ì ê°ê²©ì ëíë´ê³ ììµëë¤.
let range = {
from: 1,
to: 5
};
// ìëì ê°ì´ for..ofê° ëìí ì ìëë¡ íë ê² ëª©íì
ëë¤.
// for(let num of range) ... num=1,2,3,4,5
range를 ì´í°ë¬ë¸ë¡ ë§ë¤ë ¤ë©´(for..ofê° ëìíëë¡ íë ¤ë©´) ê°ì²´ì Symbol.iterator(í¹ì ë´ì¥ ì¬ë³¼)ë¼ë ë©ìë를 ì¶ê°í´ ìëì ê°ì ì¼ì´ ë²ì´ì§ëë¡ í´ì¼ í©ëë¤.
for..ofê° ììëìë§ìfor..ofëSymbol.iterator를 í¸ì¶í©ëë¤(Symbol.iteratorê° ìì¼ë©´ ìë¬ê° ë°ìí©ëë¤).Symbol.iteratorë ë°ëì ì´í°ë ì´í°(iterator, ë©ìënextê° ìë ê°ì²´) 를 ë°íí´ì¼ í©ëë¤.- ì´í
for..ofë ë°íë ê°ì²´(ì´í°ë ì´í°)ë§ì ëìì¼ë¡ ëìí©ëë¤. for..ofì ë¤ì ê°ì´ íìíë©´,for..ofë ì´í°ë ì´í°ìnext()ë©ìë를 í¸ì¶í©ëë¤.next()ì ë°í ê°ì{done: Boolean, value: any}ì ê°ì ííì´ì´ì¼ í©ëë¤.done=trueë ë°ë³µì´ ì¢ ë£ëììì ì미í©ëë¤.done=falseì¼ëvalueì ë¤ì ê°ì´ ì ì¥ë©ëë¤.
range를 ë°ë³µ ê°ë¥í ê°ì²´ë¡ ë§ë¤ì´ì£¼ë ì½ëë ë¤ìê³¼ ê°ìµëë¤.
let range = {
from: 1,
to: 5
};
// 1. for..of ìµì´ í¸ì¶ ì, Symbol.iteratorê° í¸ì¶ë©ëë¤.
range[Symbol.iterator] = function() {
// Symbol.iteratorë ì´í°ë ì´í° ê°ì²´ë¥¼ ë°íí©ëë¤.
// 2. ì´í for..ofë ë°íë ì´í°ë ì´í° ê°ì²´ë§ì ëìì¼ë¡ ëìíëë°, ì´ë ë¤ì ê°ë ì í´ì§ëë¤.
return {
current: this.from,
last: this.to,
// 3. for..of ë°ë³µë¬¸ì ìí´ ë°ë³µë§ë¤ next()ê° í¸ì¶ë©ëë¤.
next() {
// 4. next()ë ê°ì ê°ì²´ {done:.., value :...}ííë¡ ë°íí´ì¼ í©ëë¤.
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
};
// ì´ì ìëí ëë¡ ëìí©ëë¤!
for (let num of range) {
alert(num); // 1, then 2, 3, 4, 5
}
ì´í°ë¬ë¸ ê°ì²´ì íµì¬ì 'ê´ì¬ì¬ì ë¶ë¦¬(Separation of concern, SoC)'ì ììµëë¤.
rangeì ë©ìënext()ê° ììµëë¤.- ëì
range[Symbol.iterator]()를 í¸ì¶í´ì ë§ë âì´í°ë ì´í°â ê°ì²´ì ì´ ê°ì²´ì ë©ìënext()ìì ë°ë³µì ì¬ì©ë ê°ì ë§ë¤ì´ë ëë¤.
ì´ë ê² íë©´ ì´í°ë ì´í° ê°ì²´ì ë°ë³µ ëìì¸ ê°ì²´ë¥¼ ë¶ë¦¬í ì ììµëë¤.
ì´í°ë ì´í° ê°ì²´ì ë°ë³µ ëì ê°ì²´ë¥¼ í©ì³ì range ì체를 ì´í°ë ì´í°ë¡ ë§ë¤ë©´ ì½ëê° ë ê°ë¨í´ì§ëë¤.
ë¤ìì²ë¼ ë§ì´ì£ .
let range = {
from: 1,
to: 5,
[Symbol.iterator]() {
this.current = this.from;
return this;
},
next() {
if (this.current <= this.to) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
for (let num of range) {
alert(num); // 1, then 2, 3, 4, 5
}
ì´ì range[Symbol.iterator]()ê° ê°ì²´ range ì체를 ë°íí©ëë¤. ë°íë ê°ì²´ì íì ë©ìëì¸ next()ê° ìê³ this.currentì ë°ë³µì´ ì¼ë§ë ì§íëìëì§ë¥¼ ëíë´ë ê°ë ì ì¥ëì´ ììµëë¤. ì½ëë ë ì§§ìì¡ê³ ì. ì´ë ê² ìì±íë ê² ì¢ì ëê° ì¢
ì¢
ììµëë¤.
ë¨ì ì ë ê°ì for..of ë°ë³µë¬¸ì íëì ê°ì²´ì ëìì ì¬ì©í ì ìë¤ë ì ì
ëë¤. ì´í°ë ì´í°(ê°ì²´ ìì )ê° íëë¿ì´ì´ì ë ë°ë³µë¬¸ì´ ë°ë³µ ìí를 ê³µì í기 ë문ì´ì£ . ê·¸ë°ë° ëìì ë ê°ì for..of를 ì¬ì©íë ê²ì ë¹ë기 ì²ë¦¬ììë íí ì¼ì´ì¤ë ìëëë¤.
무ìí ë§ì ì´í°ë ì´í°ë ê°ë¥í©ëë¤. rangeìì range.toì Infinity를 í ë¹íë©´ rangeê° ë¬´íëê° ëì£ . 무ìí ë§ì ìì¬ ëì(pseudorandom numbers)를 ìì±íë ì´í°ë¬ë¸ ê°ì²´ë¥¼ ë§ëë ê²ë ê°ë¥í©ëë¤. ì´ ë°©ë²ì´ ì ì©íê² ì°ì´ë ê²½ì°ë ììµëë¤.
nextì ì ì½ì¬íì´ ììµëë¤. nextê° ê°ì ê³ì ë°ííë ê²ì ì ìì ì¸ ëìì
ëë¤.
ë¬¼ë¡ ìì ê°ì ì´í°ë¬ë¸ì for..of ë°ë³µë¬¸ì ì¬ì©íë©´ ëì´ ìì ê²ëë¤. ê·¸ë ë¤ íëë¼ë break를 ì¬ì©íë©´ ì¸ì ë ì§ ë°ë³µì ë©ì¶ ì ììµëë¤.
문ìì´ì ì´í°ë¬ë¸ì ëë¤
ë°°ì´ê³¼ 문ìì´ì ê°ì¥ ê´ë²ìíê² ì°ì´ë ë´ì¥ ì´í°ë¬ë¸ì ëë¤.
for..ofë 문ìì´ì ê° ê¸ì를 ìíí©ëë¤.
for (let char of "test") {
// ê¸ì íëë¹ í ë² ì¤íë©ëë¤(4í í¸ì¶).
alert( char ); // t, e, s, tê° ì°¨ë¡ëë¡ ì¶ë ¥ë¨
}
ìë¡ê²ì´í¸ ì(surrogate pair)ìë ì ëìí©ëë¤.
let str = 'ð³ð';
for (let char of str) {
alert( char ); // ð³ì ðê° ì°¨ë¡ëë¡ ì¶ë ¥ë¨
}
ì´í°ë ì´í°ë¥¼ ëª ìì ì¼ë¡ í¸ì¶í기
ì´í°ë ì´í°ë¥¼ ì´ë»ê² ëª ìì ì¼ë¡ ì¬ì©í ì ìëì§ ì´í´ë³´ë©´ì ì¢ ë ê¹ê² ì´í´í´ë´ ìë¤.
for..of를 ì¬ì©íì ëì ëì¼í ë°©ë²ì¼ë¡ 문ìì´ì ìíí ê±´ë°, ì´ë²ì ì§ì í¸ì¶ì íµí´ì ìíí´ë³´ê² ìµëë¤. ë¤ì ì½ëë 문ìì´ ì´í°ë ì´í°ë¥¼ ë§ë¤ê³ , ì¬ê¸°ì ê°ì âìëì¼ë¡â ê°ì ¸ìµëë¤.
let str = "Hello";
// for..of를 ì¬ì©í ê²ê³¼ ëì¼í ìì
ì í©ëë¤.
// for (let char of str) alert(char);
let iterator = str[Symbol.iterator]();
while (true) {
let result = iterator.next();
if (result.done) break;
alert(result.value); // ê¸ìê° íëì© ì¶ë ¥ë©ëë¤.
}
ì´í°ë ì´í°ë¥¼ ëª
ìì ì¼ë¡ í¸ì¶íë ê²½ì°ë ê±°ì ìëë°, ì´ ë°©ë²ì ì¬ì©íë©´ for..of를 ì¬ì©íë ê²ë³´ë¤ ë°ë³µ ê³¼ì ì ë ì íµì í ì ìë¤ë ì¥ì ì´ ììµëë¤. ë°ë³µì ììíë¤ê° ì ì ë©ì¶° ë¤ë¥¸ ìì
ì íë¤ê° ë¤ì ë°ë³µì ììíë ê²ê³¼ ê°ì´ ë°ë³µ ê³¼ì ì ì¬ë¬ ê°ë¡ 쪼ê°ë ê²ì´ ê°ë¥í©ëë¤.
ì´í°ë¬ë¸ê³¼ ì ì¬ ë°°ì´
ë¹ì·í´ ë³´ì´ì§ë§ ì주 ë¤ë¥¸ ì©ì´ ë ê°ì§ê° ììµëë¤. í·ê°ë¦¬ì§ ìì¼ë ¤ë©´ ë ì©ì´ë¥¼ ì ì´í´íê³ ìì´ì¼ í©ëë¤.
- ì´í°ë¬ë¸(iterable) ì ììì ì¤ëª
í ë°ì ê°ì´ ë©ìë
Symbol.iteratorê° êµ¬íë ê°ì²´ì ëë¤. - ì ì¬ ë°°ì´(array-like) ì ì¸ë±ì¤ì
lengthíë¡í¼í°ê° ìì´ì ë°°ì´ì²ë¼ ë³´ì´ë ê°ì²´ì ëë¤.
ë¸ë¼ì°ì ë±ì í¸ì¤í¸ íê²½ìì ìë°ì¤í¬ë¦½í¸ë¥¼ ì¬ì©í´ 문ì 를 í´ê²°í ë ì´í°ë¬ë¸ ê°ì²´ë ì ì¬ ë°°ì´ ê°ì²´ í¹ì ë ë¤ì¸ ê°ì²´ë¥¼ ë§ë ì ììµëë¤.
ì´í°ë¬ë¸ ê°ì²´(for..of 를 ì¬ì©í ì ìì)ì´ë©´ì ì ì¬ë°°ì´ ê°ì²´(ì«ì ì¸ë±ì¤ì length íë¡í¼í°ê° ìì)ì¸ ë¬¸ìì´ì´ ëíì ì¸ ìì
ëë¤.
ì´í°ë¬ë¸ ê°ì²´ë¼ê³ í´ì ì ì¬ ë°°ì´ ê°ì²´ë ìëëë¤. ì ì¬ ë°°ì´ ê°ì²´ë¼ê³ í´ì ì´í°ë¬ë¸ ê°ì²´ì¸ ê²ë ìëëë¤.
ì ììì rangeë ì´í°ë¬ë¸ ê°ì²´ì´ê¸´ íì§ë§ ì¸ë±ì¤ë ìê³ length íë¡í¼í°ë ìì¼ë¯ë¡ ì ì¬ ë°°ì´ ê°ì²´ê° ìëëë¤.
ìë ììì ê°ì²´ë ì ì¬ ë°°ì´ ê°ì²´ì´ê¸´ íì§ë§ ì´í°ë¬ë¸ ê°ì²´ê° ìëëë¤.
let arrayLike = { // ì¸ë±ì¤ì lengthíë¡í¼í°ê° ìì => ì ì¬ ë°°ì´
0: "Hello",
1: "World",
length: 2
};
// Symbol.iteratorê° ìì¼ë¯ë¡ ìë¬ ë°ì
for (let item of arrayLike) {}
ì´í°ë¬ë¸ê³¼ ì ì¬ ë°°ì´ì ëê° ë°°ì´ì´ ìë기 ë문ì push, pop ë±ì ë©ìë를 ì§ìíì§ ììµëë¤. ì´í°ë¬ë¸ê³¼ ì ì¬ ë°°ì´ì ë°°ì´ì²ë¼ ë¤ë£¨ê³ ì¶ì ë ì´ë° í¹ì§ì ë¶í¸í¨ì ì´ëí©ëë¤. rangeì ë°°ì´ ë©ìë를 ì¬ì©í´ 무ì¸ê°ë¥¼ íê³ ì¶ì ëì²ë¼ ë§ì´ì£ . ì´ë»ê² íë©´ ì´í°ë¬ë¸ê³¼ ì ì¬ ë°°ì´ì ë°°ì´ ë©ìë를 ì ì©í ì ììê¹ì?
Array.from
ë²ì© ë©ìë Array.fromë ì´í°ë¬ë¸ì´ë ì ì¬ ë°°ì´ì ë°ì âì§ì§â Array를 ë§ë¤ì´ì¤ëë¤. ì´ ê³¼ì ì ê±°ì¹ë©´ ì´í°ë¬ë¸ì´ë ì ì¬ ë°°ì´ì ë°°ì´ ë©ìë를 ì¬ì©í ì ììµëë¤.
ìì:
let arrayLike = {
0: "Hello",
1: "World",
length: 2
};
let arr = Array.from(arrayLike); // (*)
alert(arr.pop()); // World (ë©ìëê° ì ëë¡ ëìí©ëë¤.)
(*)ë¡ íìí ì¤ì ìë Array.fromì ê°ì²´ë¥¼ ë°ì ì´í°ë¬ë¸ì´ë ì ì¬ ë°°ì´ì¸ì§ ì¡°ì¬í©ëë¤. ë겨 ë°ì ì¸ìê° ì´í°ë¬ë¸ì´ë ì ì¬ ë°°ì´ì¸ ê²½ì°, ìë¡ì´ ë°°ì´ì ë§ë¤ê³ ê°ì²´ì 모ë ìì를 ìë¡ê² ë§ë ë°°ì´ë¡ ë³µì¬í©ëë¤.
ì´í°ë¬ë¸ì ì¬ì©í ììë ë¤ìê³¼ ê°ìµëë¤.
// rangeë ì±í° ì쪽 ìììì ê·¸ëë¡ ê°ì ¸ìë¤ê³ ê°ì í©ìë¤.
let arr = Array.from(range);
alert(arr); // 1,2,3,4,5 (ë°°ì´-문ìì´ í ë³íì´ ì ëë¡ ëìí©ëë¤.)
Array.fromì â매í(mapping)â í¨ì를 ì íì ì¼ë¡ ëê²¨ì¤ ì ììµëë¤.
Array.from(obj[, mapFn, thisArg])
mapFnì ë ë²ì§¸ ì¸ìë¡ ë겨주면 ìë¡ì´ ë°°ì´ì objì ìì를 ì¶ê°í기 ì ì ê° ìì를 ëìì¼ë¡ mapFnì ì ì©í ì ììµëë¤. ìë¡ì´ ë°°ì´ì mapFnì ì ì©íê³ ë°íë ê°ì´ ì¶ê°ë©ëë¤. ì¸ ë²ì§¸ ì¸ì thisArgë ê° ììì this를 ì§ì í ì ìëë¡ í´ì¤ëë¤.
ìì:
// rangeë ì±í° ì쪽 ìììì ê·¸ëë¡ ê°ì ¸ìë¤ê³ ê°ì í©ìë¤.
// ê° ì«ì를 ì ê³±
let arr = Array.from(range, num => num * num);
alert(arr); // 1,4,9,16,25
ìë ìììì Array.from를 ì¬ì©í´ 문ìì´ì ë°°ì´ë¡ ë§ë¤ì´ë³´ììµëë¤.
let str = 'ð³ð';
// str를 ë¶í´í´ ê¸ìê° ë´ê¸´ ë°°ì´ë¡ ë§ë¦
let chars = Array.from(str);
alert(chars[0]); // ð³
alert(chars[1]); // ð
alert(chars.length); // 2
Array.fromì str.splitê³¼ ë¬ë¦¬, 문ìì´ ìì²´ê° ê°ì§ ì´í°ë¬ë¸ ìì±ì ì´ì©í´ ëìí©ëë¤. ë°ë¼ì for..ofì²ë¼ ìë¡ê²ì´í¸ ììë ì ëë¡ ì ì©ë©ëë¤.
ì ììë 기ì ì ì¼ë¡ ìë ììì ëì¼íê² ëìíë¤ê³ ë³´ìë©´ ë©ëë¤.
let str = 'ð³ð';
let chars = []; // Array.from ë´ë¶ìì ìëì ëì¼í ë°ë³µë¬¸ì´ ëìê°ëë¤.
for (let char of str) {
chars.push(char);
}
alert(chars);
ì´ì¨ë Array.fromì ì¬ì©í ììê° ë ì§§ìµëë¤.
Array.fromì ì¬ì©íë©´ ìë¡ê²ì´í¸ ìì ì²ë¦¬í ì ìë slice를 ì§ì 구íí ìë ììµëë¤.
function slice(str, start, end) {
return Array.from(str).slice(start, end).join('');
}
let str = 'ð³ðð©·¶';
alert( slice(str, 1, 3) ); // ðð©·¶
// ë´ì¥ ìì ë©ìëë ìë¡ê²ì´í¸ ìì ì§ìíì§ ììµëë¤.
alert( str.slice(1, 3) ); // ì°ë ê¹ê° ì¶ë ¥ (ììì´ ë¤ë¥¸ í¹ì ê°)
ìì½
for..ofì ì¬ì©í ì ìë ê°ì²´ë¥¼ ì´í°ë¬ë¸ì´ë¼ê³ ë¶ë¦
ëë¤.
- ì´í°ë¬ë¸ì ë©ìë
Symbol.iteratorê° ë°ëì 구íëì´ ìì´ì¼ í©ëë¤.obj[Symbol.iterator]ì ê²°ê³¼ë ì´í°ë ì´í°ë¼ê³ ë¶ë¦ ëë¤. ì´í°ë ì´í°ë ì´ì´ì§ë ë°ë³µ ê³¼ì ì ì²ë¦¬í©ëë¤.- ì´í°ë ì´í°ì ê°ì²´
{done: Boolean, value: any}ì ë°ííë ë©ìënext()ê° ë°ëì 구íëì´ ìì´ì¼ í©ëë¤. ì¬ê¸°ìdone:trueì ë°ë³µì´ ëë¬ìì ì미íê³ ê·¸ë ì§ ìì ê²½ì°ìvalueê° ë¤ì ê°ì´ ë©ëë¤.
- ë©ìë
Symbol.iteratorëfor..ofì ìí´ ìëì¼ë¡ í¸ì¶ëëë°, ê°ë°ìê° ëª ìì ì¼ë¡ í¸ì¶íë ê²ë ê°ë¥í©ëë¤. - 문ìì´ì´ë ë°°ì´ ê°ì ë´ì¥ ì´í°ë¬ë¸ìë
Symbol.iteratorê° êµ¬íëì´ ììµëë¤. - 문ìì´ ì´í°ë ì´í°ë ìë¡ê²ì´í¸ ìì ì§ìí©ëë¤.
ì¸ë±ì¤ì length íë¡í¼í°ê° ìë ê°ì²´ë ì ì¬ ë°°ì´ì´ë¼ ë¶ë¦½ëë¤. ì ì¬ ë°°ì´ ê°ì²´ì ë¤ìí íë¡í¼í°ì ë©ìëê° ìì ì ìëë° ë°°ì´ ë´ì¥ ë©ìëë ììµëë¤.
ëª ì¸ì를 ë³´ë©´ ëë¶ë¶ì ë©ìëë âì§ì§â ë°°ì´ì´ ìë ì´í°ë¬ë¸ì´ë ì ì¬ ë°°ì´ì ëìì¼ë¡ ëìíë¤ê³ ì°ì¬ ìë걸 ë³¼ ì ììµëë¤. ì´ ë°©ë²ì´ ë ì¶ìì ì´ê¸° ë문ì ëë¤.
Array.from(obj[, mapFn, thisArg])ì ì¬ì©íë©´ ì´í°ë¬ë¸ì´ë ì ì¬ ë°°ì´ì¸ obj를 ì§ì§ Arrayë¡ ë§ë¤ ì ììµëë¤. ì´ë ê² íë©´ objìë ë°°ì´ ë©ìë를 ì¬ì©í ì ìì£ . ì í ì¸ì mapFnì thisArgë ê° ììì í¨ì를 ì ì©í ì ìê² í´ì¤ëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.