์ ๋ฒ์ฃผ ๋ชฉ์์ผ๋ถํฐ ์ฃผ๋ง๋์ ๊ณผ์ ๋ฅผ ํ๊ณ ๋๋์ด ์ฝ๋ ๋ฆฌ๋ทฐ๋ผ๋ ๊ฒ์ ์ฒ์ ๋ฐ์๋ดค๋ค.
์์ง ๋์ ์ค๋ ฅ์ด ๋ถ์กฑํด์ ๊ณ ์ณ์ผํ ์ ๋ค์ด ๋งค์ฐ ๋ง์ง๋ง, ๋ฉํ ๋๊ณผ ํ์๋ค์ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์๋ณผ ์ ์๋ค๋ ์ฌ์ค์ ๊ฐ์ฌํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ค๋์ ์ฃผ๋ง์ ๊ฐ์๋ฅผ ๋ค์ ๋๋ถ์ ์ค๋ ๊ฐ์๋ ์๊ฐํ๋ค...
์๊ฐํ๋ค๋ ๊ฒ๋ง์ผ๋ก ์ด๋ ๊ฒ ๊ธฐ์๋ค๋...๐
๊ณผ์ ๋ ์ผ์ฐ ์คํํด์ฃผ์
์ ์ค๋๋ถํฐ ์ฒ์ฒํ ๊ณ ๋ฏผํด๋ด์ผ๊ฒ ๋ค!!
์ด๋ฒ์ฃผ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ๋ฐฐ์ด๋ค.
๊ฐ์ฌ๋์ด ๋ฐ๋์
จ๋๋ฐ ์ด๋ฒ์ฃผ๋ ์ญ์๋ ์ค๋ช
์ ์ํด์ฃผ์
์ ์ดํด๊ฐ ์์๋๋ค.
1. DOM
2. ํ๊ฐ์ ์ผ๊ธ
3. ์ดํฐ๋ฌ๋ธ/์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ
4. ์ ๋๋ ์ดํฐ
์ค๋์ ์ค์ํ ๊ฐ๋ ์ธ ์ดํฐ๋ฌ๋ธ/์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ๋ํด ๋ค๋ค๋ณด๊ณ ์ ํ๋ค.
[Symbol.iterator]()
๋ฅผ ๊ฐ์ง ๊ฐ{value, done} ๊ฐ์ฒด๋ฅผ ๋ฆฌํด
ํ๋ next()๋ฅผ ๊ฐ์ง ๊ฐfor...of, ์ ๊ฐ ์ฐ์ฐ์ ๋ฑ๊ณผ ํจ๊ป ๋์
ํ๋๋กํ ๊ท์ฝ// ์ฌ์ฉ์ ์ ์ ์ดํฐ๋ฌ๋ธ์ ํตํด ์์๋ณด๊ธฐ
const iterable = {
// Symbol.iterator๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์, for...of ๋์ ๊ฐ๋ฅ
[Symbol.iterator](){
let i = 3;
// iterator ๊ฐ์ฒด๋ฅผ ๋ฆฌํด
return {
// iterator๋ {value, done}์ ๋ฆฌํด
next(){
return i === 0 ? { done: true } : { value: i--, done: false };
},
// wellformed ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ถ๊ฐ
[Symbol.iterator]() {return this}
}
}
};
let iterator = iterable[Symbol.iterator]();
for (const a of iterable) log(a); // 3 2 1
// wellformed ์ดํฐ๋ ์ดํฐ๋ก ๋ณ๊ฒฝ ํ ์๋ ์ฝ๋๋ ๋์
iterator.next();
for (const a of iterator) log(a); // 2 1
// wellformed ์ดํฐ๋ ์ดํฐ๋ผ๋ฉด, ์ดํฐ๋ ์ดํฐ ์ญ์ ์ดํฐ๋ฌ๋ธ ํด์ผํจ
const arr2 = [1, 2, 3];
let iter = arr2[Symbol.iterator]();
iter.next();
// ์๊ธฐ ์์ ์ ๋ฐํ
log(iter[Symbol.iterator]() === iter) // true
for (const a of iter) log(a); // 2 3
๊ฐ์๋ ๋ง๊ณ ๊ณผ์ ๋ ๋ง์ ๋นก์ผ ์ปค๋ฆฌํ๋ผ์ด์ง๋ง, ํ๋ฃจ ํ๋ฃจ ์ง์์ ์์๊ฐ๋ ๋๋์ด ์ข๊ณ ํ๋ฃจ๋ฅผ ์์ฐจ๊ฒ ๋ณด๋ผ ์ ์์ด ๊ธฐ์๋ค.
๋ฐ๋ธ์ฝ์ค์ ๋ถ์ง ๋ชปํ๋ค๋ฉด, ํผ์ ๊ณต๋ถํ๋ฉฐ ๊ฐํผ๋ฅผ ์ก์ง ๋ชปํ์ํ
๋ฐ ์์ผ ๋ฆฌ์ ๋งค๋์ ๋๊ป ๊ฐ์ฌํ๋ค~~๐
5๊ฐ์๊ฐ ์ต์ ์ ๋คํด ๋ชฐ์
ํ์๋ ๋ค์ง์ ๋ ํด๋ณธ๋ค!