π <λͺ¨λ μλ°μ€ν¬λ¦½νΈ 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}