๐ <๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive>๋ฅผ ๋ฐํ์ผ๋ก ์์ฝ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
// ์ฌ์ฉ์ ์ ์๋ก ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ์ฝ๋
// ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด
const iterable = {
[Symbol.iterator]() {
let num = 0;
return {
next() {
return {
value: num++, done: num === 5
};
}
}
}
}
// ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ for ...of๋ก ์ํ๊ฐ๋ฅํ๋ค
for (const item of iterable) {
console.log(item);
}
Symbol.iterator
๋ฉ์๋์ ๋ฐํ๊ฐnext
ํจ์๋ฅผ ๊ฐ๋๋ค. ์ด ํจ์๋ ์ดํฐ๋ฌ๋ธ์ ์์๋ฅผ ํ์ํ๊ธฐ ์ํ ํฌ์ธํฐ์ด๋ค.next
ํจ์๋ฅผ ํธ์ถํ๋ฉด ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ํํ๋ฉด์ value์ done์ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.// ์ดํฐ๋ฌ๋ธ์ ๋ฆฌํดํ๋ ํจ์
const func = () => {
let i = 0;
const max = 3;
return {
[Symbol.iterator]() {
return {
next() {
return { value: i, done: i++ >= max };
}
}
}
}
}
const iterable = func();
// ์ดํฐ๋ฌ๋ธ์ Symbol.iteratorํจ์๋ฅผ ํตํด ์ดํฐ๋ ์ดํฐ๋ฅผ ์์ฑํ ์ ์๋ค.
const iterator = iterable[Symbol.iterator]();
// ์ดํฐ๋ ์ดํฐ์ next๋ฉ์๋๋ ์ดํฐ๋ฌ๋ธ์ ์์๋๋ก ํ๋์ฉ ์ํํ ์ ์๋ค.
console.log(iterator.next()); // {value: 0, done: false}
console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 3, done: true}