Iterable & Iterator
For Loop
μλ°μ€ν¬λ¦½νΈμ λ°λ³΅λ¬Έμ for loop
λ λ€μ λͺκ°μ§λ‘ λλλ€.
- for
- κ°μ₯ κΈ°λ³Έμ μΈ
for loop
- κ°μ₯ κΈ°λ³Έμ μΈ
- forEach
- λ°°μ΄μ μννλ©°
value
μindex
λ₯Ό 맀κ°λ³μλ‘ μ λ¬νλ€. break
,return
μΌλ‘ 루νλ₯Ό μ€λ¨ν μ μλ€.
- λ°°μ΄μ μννλ©°
- for in
- λ°°μ΄μ μΈλ±μ€λ§ μν νλκ²μ΄ μλ νλ‘ν νμ 체μΈμ ν¬ν¨ν λͺ¨λ μμ±μ μννλ€.
- λ°°μ΄λ³΄λ€λ κ°μ²΄λ₯Ό μν νκΈ° μν΄ λ§λ€μ΄μ§ 루νμ΄λ€.
- for of
for in
μΌλ‘ λ°°μ΄μ μνν λ μκΈ°λ λ¬Έμ μ λ€μ ν΄μνμλ€.
for of
λ μνκ°λ₯ν (iterable) κ°μ²΄λ₯Ό μλλ‘ μ¬μ© κ°λ₯ νλ€.
μνκ°λ₯ν (Iterable) ν κ°μ²΄λ Symbol.iterator
μ¬λ³Όμ μμ±μΌλ‘ κ°μ§κ³ μμΌλ©° μ΄ν°λ μ΄ν° κ°μ²΄λ₯Ό λ°ννλ κ°μ²΄ λ₯Ό λ»νλ€.
ν΄λΉ μ€ν©μ μ΄ν°λ¬λΈ νλ‘ν μ½ μ΄λΌκ³ νλ©° ν΄λΉ μ€ν©μ ꡬνν κ°μ²΄λ₯Ό μ΄ν°λ¬λΈ κ°μ²΄ λΌκ³ νλ€.
Iterable
ECMA6 μμ λμ λ μ΄ν°λ μ΄μ νλ‘ν μ½ (Iteration Protocal) μ λ°μ΄ν° 컬λ μ μ μννκΈ° μν νλ‘ν μ½ (κ·μΉ) μ΄λ€.
μ΄ κ°μ²΄λ for...of
λ‘ μν κ°λ₯νλ©° Spread
λ¬Έλ²μ νΌμ°μ°μ (λμ) κ° λ μ μλ€.
μ΄ν°λ¬λΈ νλ‘ν μ½μ μ€μν κ°μ²΄λ₯Ό μ΄ν°λ¬λΈ κ°μ²΄λΌκ³ νλ€.
μ¦ λ€μ λ§ν΄ μ΄ν°λ¬λΈμ Symbol.iterator
λ©μλλ₯Ό ꡬννκ±°λ νλ‘ν νμ
체μΈμ μν΄ μμν κ°μ²΄λ₯Ό λ§νλ€.
μΌλ°μ μΌλ‘ λ°°μ΄μ Symbol.iterator
λ©μλλ₯Ό λ°ννλ€. κ·Έλ¬λ―λ‘ μ΄ν°λ¬λΈν κ°μ²΄μ΄λ€.
μ΄ν°λ¬λΈ = μ΄ν°λ¬λΈ νλ‘ν μ½μ μ€μν κ°μ²΄
const array = [1, 2, 3];
// λ°°μ΄μ Symbol.iterator λ©μλλ₯Ό μμ
console.log(Symbol.iterator in array); // true
for (const num of array) {
console.log(num);
}
const obj = {a: 1, b: 2};
// μΌλ°μ μΈ κ°μ²΄λ Symbol.iterator λ©μλλ₯Ό μμ νμ§ μλλ€.
console.log(Symbol.iterator in obj); // false
// TypeError: obj is not iterable
// -> obj λ μ΄ν°λ¬λΈ νμ§ μλ€. μ¦ μν κ°λ₯νμ§ μλ€.
// -> Symbol.iterator λ©μλκ° μκΈ° λλ¬Έμ΄λ€.
for (const p of obj) {
console.log(p);
}
Symbol.iterator
μ ν€λ₯Ό κ°μ§κ³ μλ κ°μ²΄λ‘μ¨ λ€μ μ€νμ ꡬνν κ°μ²΄μ΄λ€.
Iterator
μΈν°νμ΄μ€λ₯Ό ꡬν νκ³ μλ κ°μ²΄λ₯ΌIterable
κ°μ²΄λΌκ³ νλ€.
Symbol.iterator
μ ν€λ₯Ό κ°κ³ μλ€.- κ°μΌλ‘ μΈμλ₯Ό λ°μ§ μκ³ Iterator Object λ₯Ό λ°ννλ ν¨μκ° μ¨λ€.
{
[Symbol.iterator]: function () {
return {
next: function {
return { value: 1, done: false };
}
};
}
}
Iterator
μ΄ν°λ¬λΈκ³Ό λ°μ ν κ΄λ ¨μ΄ μλ μ΄ν°λ μ΄ν°λ μ΄ν°λ μ΄ν° νλ‘ν μ½μ μ€μν κ°μ²΄μ΄λ€.
μ΄ν°λ μ΄ν° νλ‘ν μ½μ μ΄ν°λ¬λΈ κ°μ²΄κ° λ°ννλ Symbol.iterator
λ₯Ό λ§νλ€.
μ΄ Symbol.iterator
λ λ€μκ³Ό κ°μ νΉμ§μ κ°λλ€.
next()
λ©μλλ₯Ό κ°μ§κ³ μλ€.next()
λ©μλλ₯Ό νΈμΆνλ©΄ μ΄ν°λ¬λΈ κ°μ²΄λ₯Ό μννλ ꡬ쑰λ₯Ό κ°μ§λ€.- μ΄ν°λ¬λΈ κ°μ²΄λ₯Ό μννλ©΄μ
value
,done
νλ‘νΌν°λ₯Ό κ°μ§λ κ°μ²΄λ₯Ό λ°ννλ€. (Iterator Result)
const array = [1, 2, 3];
// μ΄ν°λ μ΄ν°λ₯Ό λ°ν
const iterator = array[Symbol.iterator]();
// next() λ©μλλ₯Ό νΈμΆν λ λ§λ€ μ΄ν°λ¬λΈμ μννλ€.
// next() λ©μλλ₯Ό νΈμΆνλ©΄ value, done νλ‘νΌν°λ₯Ό κ°λ Iterator Result κ°μ²΄λ₯Ό λ°ν
console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 3, done: false}
console.log(iterator.next()); // {value: undefined, done: true}
μ΄λ TC39 μμ μ μν Iterator Interface μ μλ₯Ό λ°λ₯Έ Object
λ‘μ¨ λ΄μ©μ λ€μκ³Ό κ°λ€.
next
λΌλ ν€λ₯Ό κ°κ³ μμΌλ©° κ°μΌλ‘ μΈμλ₯Ό λ°μ§ μκ³ Iterator Result Object λ₯Ό λ°ννλ ν¨μκ° μ¨λ€.- Iterator Result Object λ
value
μdone
μ΄λΌλ ν€λ₯Ό κ°κ³ μλ€.value
λ μ€μ κ°μ μλ―Έdone
λ κ³μ λ°λ³΅ ν μ μλμ§ λ°λ₯Έboolean
κ°
μμν 0
μ λ°ννλ Iterator
{
next: function () {
return {
value: 0,
done: false
};
}
}
κ° λ°°μ΄μ μννλ©° λ°°μ΄μ λ κ°μ λ°ννλ Iterator
{
data: [1, 2, 3, 4]
next: function () {
return {
done: this.data.length === 0,
value: this.data.pop()
};
}
}
ECMA6 μμλ κ°μ²΄ 리ν°λ΄ μμ± μμμ λ°λΌ νμ± νλ€.
μλ₯Ό λ€λ©΄ μ μ½λμ
done
κ³Όvalue
μ€μμdone
μ΄ λ¨Όμ μμ±λμ΄ μκΈ° λλ¬Έμdone
μ λ¨Όμ νμ±νλ€.
ECMA5 μμλdone
μ΄λvalue
λ μ΄λκ²μ λ¨Όμ νμ±ν μ§ λ³΄μ₯μ΄ μλ¨
μμ½
- μ΄ν°λ¬λΈ νλ‘ν μ½μ μ€μ -> μ΄ν°λ¬λΈ κ°μ²΄
- Symbol.iterator λ©μλλ₯Ό μμ ν κ°μ²΄
- νΉμ νλ‘ν νμ 체μΈμ μμν κ°μ²΄
- μ΄ν°λ μ΄ν° νλ‘ν μ½μ μ€μ -> μ΄ν°λ μ΄ν° κ°μ²΄
- Symbol.iterator λ©μλλ₯Ό ꡬνν κ°μ²΄
next()
λ©μλλ₯Ό κ°μ§κ³ μκ³next()
λ©μλλ₯Ό νΈμΆνλ©΄ μ΄ν°λ¬λΈμ μννλ©°value
,done
νλ‘νΌν°λ₯Ό κ°λ κ²°κ³Ό κ°μ²΄λ₯Ό λ°ννλ λμꡬ쑰λ₯Ό κ°μ§λ κ°μ²΄