μ΄ν°λ¬λΈ
μ΄ν°λ μ΄μ νλ‘ν μ½
- μ΄ν°λ μ΄μ νλ‘ν μ½μ μν κ°λ₯ν λ°μ΄ν° 컬λ μ μ λ§λ€κΈ° μν΄ ECMAScript μ¬μμ μ μνμ¬ λ―Έλ¦¬ μ½μν κ·μΉμ΄λ€.
- es6μ΄μ μ μν κ°λ₯ν λ°μ΄ν° 컬λ μ (λ°°μ΄, λ¬Έμμ΄ λ±λ±..)μ ν΅μΌλ κ·μ½ μμ΄ κ°μ λλ¦μ ꡬ쑰λ₯Ό κ°μ§κ³ μμ
- es6μμλ μν κ°λ₯ν λ°μ΄ν° 컬λ μ μ μ΄ν°λ μ΄μ νλ‘ν μ½μ μ€μνλ μ΄ν°λ¬λΈλ‘ ν΅μΌ
- μ΄ν°λ μ΄μ νλ‘ν μ½μλ μ΄ν°λ¬λΈ νλ‘ν μ½κ³Ό μ΄ν°λ μ΄ν° νλ‘ν μ½μ΄ μλ€.
μ΄ν°λ¬λΈ νλ‘ν μ½(iterable protocol
)
- Well-known SymbolμΈ Symbol.iteratorλ₯Ό νλ‘νΌν° ν€λ‘ μ¬μ©ν λ©μλλ₯Ό μ§μ ꡬννκ±°λ μμ λ°μ Symbol.iterator λ©μλλ₯Ό νΈμΆνλ©΄ μ΄ν°λ μ΄ν° νλ‘ν μ½μ μ€μν μ΄ν°λ μ΄ν°λ₯Ό λ°ννλ κ·μ½μ μ΄ν°λ¬λΈ νλ‘ν μ½μ΄λΌ νλ€.
- μ΄ν°λ¬λΈ νλ‘ν μ½μ μ€μν κ°μ²΄λ₯Ό μ΄ν°λ¬λΈ μ΄λΌνλ€.
- μ΄ν°λ¬λΈμ
for...of
λ¬ΈμΌλ‘ μνν μ μκ³ , μ€νλ λ λ¬Έλ²κ³Ό λ°°μ΄ λμ€νΈλμ²λ§ ν λΉμ λμμΌλ‘ μ¬μ©ν μ μλ€.
μ΄ν°λ μ΄ν° νλ‘ν μ½(iterator protocol
)
- μ΄ν°λ μ΄ν°λ nextλ©μλλ₯Ό μμ νκ³ next λ©μλλ₯Ό νΈμΆνλ©΄ μ΄ν°λ¬λΈμ μννλ©° valueμ done νλ‘νΌν°λ₯Ό κ°λ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄λ₯Ό λ°ν, μ΄λ¬ν κ·μ½μ μ΄ν°λ μ΄ν° νλ‘ν μ½μ΄λΌκ³ νλ€
- μ΄ν°λ μ΄ν° νλ‘ν μ½μ μ€μν κ°μ²΄λ₯Ό μ΄ν°λ μ΄ν°λΌκ³ νλ€.
μ 리
- μ΄ν°λ¬λΈ : μ΄ν°λ¬λΈ νλ‘ν μ½μ μ€μν κ°μ²΄
- μ΄ν°λ μ΄ν° : μ΄ν°λ μ΄ν° νλ‘ν μ½μ μ€μν κ°μ²΄
- μ΄ν°λ¬λΈ νλ‘ν μ½ : Symbol.iterator(μ΄κ±΄ Well-known Symbol)λ©μλλ₯Ό νΈμΆν΄μ μ΄ν°λ μ΄ν°λ₯Ό λ°ννλ κ·μ½
- μ΄ν°λ μ΄ν° νλ‘ν μ½ : μ΄ν°λ μ΄ν°μ ꡬ쑰μ λν κ·μ½μ λ§ν¨, μ΄ν°λ μ΄ν° nextλ©μλλ₯Ό μμ νκ³ nextλ©μλλ μ΄ν°λ¬λΈμ μννλ©° valueμ done νλ‘νΌν°λ₯Ό κ°λ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄λ₯Ό λ°ν ν¨
μ΄ν°λ¬λΈ
- μ΄ν°λ¬λΈμ
Symbol.iterator
λ₯Ό νλ‘νΌν° ν€λ‘ μ¬μ©ν λ©μλλ₯Ό μ§μ ꡬννκ±°λ νλ‘ν νμ 체μΈμ ν΅ν΄ μμ λ°μ κ°μ²΄ - λ°λΌμ μ΄ν°λ¬λΈ νλ‘ν μ½μ μ€μνμ§ μμ κ°μ²΄λ
for..of
λ¬ΈμΌλ‘ μν ν μ μμΌλ©° μ€νλ λ λ¬Έλ²κ³Ό λ°°μ΄ λμ€νΈλμ²λ§ ν λΉμ λμμΌλ‘ μ¬μ©ν μ μλ€.
const obj = { a: 1, b: 2 };
// μΌλ° κ°μ²΄λ Symbol.iterator λ©μλλ₯Ό ꡬννκ±°λ μμλ°μ§ μλλ€.
// λ°λΌμ μΌλ° κ°μ²΄λ μ΄ν°λ¬λΈ νλ‘ν μ½μ μ€μν μ΄ν°λ¬λΈμ΄ μλλ€.
console.log(Symbol.iterator in obj); // false
// μ΄ν°λ¬λΈμ΄ μλ μΌλ° κ°μ²΄λ for...of λ¬ΈμΌλ‘ μνν μ μλ€.
for (const item of obj) { // -> TypeError: obj is not iterable
console.log(item);
}
// μ΄ν°λ¬λΈμ΄ μλ μΌλ° κ°μ²΄λ λ°°μ΄ λμ€νΈλμ²λ§ ν λΉμ λμμΌλ‘ μ¬μ©ν μ μλ€.
const [a, b] = obj; // -> TypeError: obj is not iterable
- λ¨, μ΅μ μλ°μ€ν¬λ¦½νΈμμ μΌλ° κ°μ²΄μ μ€νλ λ λ¬Έλ²μ μ¬μ©μ νμ©νκ³ μλ€
const obj = { a: 1, b : 2};
console.log({...obj}); // { a : 1, b: 2 }
μ΄ν°λ μ΄ν°
Symbol.iterator
λ©μλκ° λ°νν μ΄ν°λ μ΄ν°λnext
λ©μλλ₯Ό κ°λλ€.- nextλ©μλλ μ΄ν°λ¬λΈμ κ° μμλ₯Ό μννκΈ° μν ν¬μΈν° μν μ νλ€.
- next ν¨μλ‘ μ΄ν°λ¬λΈμ νλμ© μνλλλ° μννλ κ²°κ³Όλ‘ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄(
iterator result object
)λ₯Ό λ°ν ν©λλ€. - result κ°μ²΄λ value νλ‘νΌν°μ done νλ‘νΌν°λ‘ ꡬμ±λμ΄ μλλ°, valueλ νμ¬ μννκ³ μλ μ΄ν°λ¬λΈμ κ°, doneμ μν μλ£ μ¬λΆλ₯Ό λνλ
λΉνΈμΈ μ΄ν°λ¬λΈ
- μλ°μ€ν¬λ¦½νΈμμ μ 곡νλ λΉνΈμΈ μ΄ν°λ¬λΈμ λ€μκ³Ό κ°μ΅λλ€.
- Array
- String
- Map
- Set
- TypedArray
- arguments
- DOM 컬λ μ (NodeList, HTMLCollection)
for ... of λ¬Έ
for ... of
λ¬Έμ μ΄ν°λ¬λΈμ μννλ©΄μ μ΄ν°λ¬λΈμ μμλ₯Ό λ³μμ ν λΉνλ€.
for (λ³μμ μΈλ¬Έ of μ΄ν°λ¬λΈ) { ... }
for ... in
λ¬Έμ νμκ³Ό μ μ¬νμ§λ§ μ°¨μ΄μ μ΄ μμ΅λλ€.
for (λ³μμ μΈλ¬Έ in κ°μ²΄) { ... }
- for ... in λ¬Έμ κ°μ²΄μ νλ‘ν νμ μ²΄μΈ μμ μ‘΄μ¬νλ λͺ¨λ νλ‘ν νμ μ νλ‘νΌν° μ€μμ [[ Enumerable ]]μ κ°μ΄ trueμΈ νλ‘νΌν°λ₯Ό μννλ©° μ΄κ±°νλ€.
- for ... of λ¬Έμ λ΄λΆμ μΌλ‘ μ΄ν°λ μ΄ν°μ next λ©μλλ₯Ό νΈμΆνμ¬ μν, result κ°μ²΄μ valueκ°μ μ μΈν λ³μμ ν λΉ, done νλ‘νΌν° κ°μ΄ true λ©΄ μνλ₯Ό μ€λ¨.
μ΄ν°λ¬λΈκ³Ό μ μ¬λ°°μ΄ κ°μ²΄
μ μ¬ λ°°μκ°μ²΄λ, λ°°μ΄ μ²λΌ μΈλ±μ€λ‘ νλ‘νΌν° κ°μ μ κ·Όν μ μκ³ , length νλ‘νΌν°λ₯Ό κ°λ κ°μ²΄λ₯Ό λ§νλ€.
μ μ¬ λ°°μ κ°μ²΄λ μ΄ν°λ¬λΈμ΄ μλ μΌλ° κ°μ²΄, λ°λΌμ Symbol.iterator λ©μλκ° μκ³ , for ... of λ¬ΈμΌλ‘ μνν μ μλ€.
λ¨,
argument
,NodeList
,HTMLCollectionμ
μ μ¬ λ°°μ΄ κ°μ²΄μ΄λ©΄μ μ΄ν°λ¬λΈμ΄λ€.Array.from λ©μλλ μ μ¬ λ°°μ΄ κ°μ²΄ λλ μ΄ν°λ¬λΈμ λ°°μ΄λ‘ λ³ννμ¬ λ°ν ν©λλ€.
const arrayLike = {
0 : 1,
1 : 2,
2 : 3,
length : 3
};
const arr = Array.from(arrayLike);
console.log(arr);
μ΄ν°λ μ΄μ νλ‘ν μ½μ νμμ±
es6μ΄μ μ μν κ°λ₯ν λ°μ΄ν° 컬λ μ λ€μ (Array, String, Map, Set λ±λ±..) ν΅μΌλ κ·μ½μμ΄ κ°μ λλ¦μ ꡬ쑰λ₯Ό κ°μ§κ³ λ€μν λ°©λ²μΌλ‘ μννμ¬ μ¬μ©λμμ΅λλ€.
es6μμλ μνκ°λ₯ν λ°μ΄ν° 컬λ μ λ€μ μ΄ν°λ μ΄μ νλ‘ν μ½μ μ€μνλ μ΄ν°λ¬λΈλ‘ ν΅μΌνμ¬ for ... ofλ¬Έ, μ€νλ λ λ¬Έλ², λ°°μ΄ λμ€νΈλμ²λ§ ν λΉμ λμμΌλ‘ μ¬μ©ν μ μλλ‘ μΌμν
μ΄ν°λ¬λΈ(μ΄ν°λ¬λΈ νλ‘ν μ½μ μ€μν κ°μ²΄)μ λ°μ΄ν° 곡κΈμμ μν μ νλ€κ³ λ³Ό μ μλ€.
λ°μ΄ν° μλΉμ λ for ..ofλ¬Έ, μ€νλ¬λλ¬Έλ², λ°°μ΄ λμ€ν°λμ²λ§ ν λΉ λ±...λ§μ½ λ€μν λ°μ΄ν° 곡κΈμκ° κ°μμ μνλ°©μμ κ°λλ€λ©΄ λ°μ΄ν° μλΉμλ λ°μ΄ν° 곡κΈμμ μν λ°©μμ λͺ¨λ μ§μν΄μΌν©λλ€. (λΉν¨μ¨μ )
μ¦, μ΄ν°λ μ΄μ νλ‘ν μ½μ κ·μ½ννμ¬ λ°μ΄ν° μλΉμκ° ν¨μ¨μ μΌλ‘ λ°μ΄ν° 곡κΈμλ₯Ό μ¬μ©ν μ μλλ‘ μ°κ²°νλ μΈν°νμ΄μ€ μν μ ν©λλ€.
μ¬μ©μ μ μ μ΄ν°λ¬λΈ
- μ΄ν°λ μ΄μ νλ‘ν μ½μ μ€μνμ§ μλ μΌλ° κ°μ²΄λ μ΄ν°λ μ΄μ νλ‘ν μ½μ μ€μνλλ‘ κ΅¬ννλ©΄ μ¬μ©μ μ μ μ΄ν°λ¬λΈμ΄ λλ€.
- νΌλ³΄λμΉ μμ΄μ ꡬνν μ¬μ©μ μ μ μ΄ν°λ¬λΈ
const fibonacci = {
[Symbol.iterator]() {
let [pre, cur] = [0,1];
const max = 10;
return {
next(){
[pre, cur] = [cur, pre+cur];
return {value : cur, done : cur >= max};
}
};
}
}
// μ΄ν°λ¬λΈμ μνν λλ§λ€ nextλ©μλκ° νΈμΆ λ¨
for(const num of fibonacci){
console.log(num);
}
μ΄ν°λ¬λΈμ μμ±νλ ν¨μ
- μΈλΆμμ μ΅λ μμ΄μ κ°μ μ λ¬ λ°μ μ΄ν°λ¬λΈμ λ°ννλ ν¨μ
// νΌλ³΄λμΉ μμ΄μ ꡬνν μ¬μ©μ μ μ μ΄ν°λ¬λΈμ λ°ννλ ν¨μ. μμ΄μ μ΅λκ°μ μΈμλ‘ μ λ¬λ°λλ€.
const fibonacciFunc = function (max) {
let [pre, cur] = [0, 1];
// Symbol.iterator λ©μλλ₯Ό ꡬνν μ΄ν°λ¬λΈμ λ°ννλ€.
return {
[Symbol.iterator]() {
return {
next() {
[pre, cur] = [cur, pre + cur];
return { value: cur, done: cur >= max };
}
};
}
};
};
// μ΄ν°λ¬λΈμ λ°ννλ ν¨μμ μμ΄μ μ΅λκ°μ μΈμλ‘ μ λ¬νλ©΄μ νΈμΆνλ€.
for (const num of fibonacciFunc(10)) {
console.log(num); // 1 2 3 5 8
}
μ΄ν°λ¬λΈμ΄λ©΄μ μ΄ν°λ μ΄ν°μΈ κ°μ²΄λ₯Ό μμ±νλ ν¨μ
- μ΄ν°λ μ΄ν° μμ±μ μν΄μ Symbol.iterator λ©μλλ₯Ό νΈμΆν΄μΌ ν©λλ€.
- μ΄ν°λ¬λΈμ΄λ©΄μ μ΄ν°λ μ΄ν°μΈ κ°μ²΄λ₯Ό λ°ννμ¬ λ©μλ νΈμΆ μμ΄ μ΄ν°λ¬λΈμ μνν μ μμ΅λλ€.
// μ΄ν°λ¬λΈμ΄λ©΄μ μ΄ν°λ μ΄ν°μΈ κ°μ²΄λ₯Ό λ°ννλ ν¨μ
const fibonacciFunc = function (max) {
let [pre, cur] = [0, 1];
// Symbol.iterator λ©μλμ next λ©μλλ₯Ό μμ ν μ΄ν°λ¬λΈμ΄λ©΄μ μ΄ν°λ μ΄ν°μΈ κ°μ²΄λ₯Ό λ°ν
return {
[Symbol.iterator]() { return this; },
// next λ©μλλ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄λ₯Ό λ°ν
next() {
[pre, cur] = [cur, pre + cur];
return { value: cur, done: cur >= max };
}
};
};
// iterλ μ΄ν°λ¬λΈμ΄λ©΄μ μ΄ν°λ μ΄ν°λ€.
let iter = fibonacciFunc(10);
// iterλ μ΄ν°λ¬λΈμ΄λ―λ‘ for...of λ¬ΈμΌλ‘ μνν μ μλ€.
for (const num of iter) {
console.log(num); // 1 2 3 5 8
}
무ν μ΄ν°λ¬λΈκ³Ό μ§μ° νκ°
- μ΄ν°λ¬λΈμ ν΅ν΄ 무ν μμ΄μ κ°λ¨ν ꡬνν μ μμ΅λλ€.
// 무ν μ΄ν°λ¬λΈμ μμ±νλ ν¨μ
const fibonacciFunc = function () {
let [pre, cur] = [0, 1];
return {
[Symbol.iterator]() { return this; },
next() {
[pre, cur] = [cur, pre + cur];
// 무νμ ꡬνν΄μΌ νλ―λ‘ done νλ‘νΌν°λ₯Ό μλ΅νλ€.
return { value: cur };
}
};
};
// fibonacciFunc ν¨μλ 무ν μ΄ν°λ¬λΈμ μμ±νλ€.
for (const num of fibonacciFunc()) {
if (num > 10000) break;
console.log(num); // 1 2 3 5 8...4181 6765
}
// λ°°μ΄ λμ€νΈλμ²λ§ ν λΉμ ν΅ν΄ 무ν μ΄ν°λ¬λΈμμ 3κ°μ μμλ§ μ·¨λνλ€.
const [f1, f2, f3] = fibonacciFunc();
console.log(f1, f2, f3); // 1 2 3
μ΄ν°λ¬λΈμ λ°μ΄ν° 곡κΈμμ μν μ ν©λλ€. (λ°°μ΄, λ¬Έμμ΄ λ±μ λͺ¨λ λ°μ΄ν°λ₯Ό λ©λͺ¨λ¦¬μ 미리 ν보ν λ€μ λ°μ΄ν°λ₯Ό 곡κΈ)
νμ§λ§, μ μμ μ μ΄ν°λ¬λΈμ μ§μ° νκ°(
lazy evaluation
)λ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό μμ±μ§μ° νκ°λ?
λ°μ΄ν°κ° νμν μμ μ΄μ κΉμ§λ 미리 λ°μ΄ν°λ₯Ό μμ±νμ§ μλ€κ° λ°μ΄ν°κ° νμν μμ μ΄ λλ©΄ κ·ΈλμΌ λΉλ‘μ λ°μ΄ν°λ₯Ό μμ±νλ κΈ°λ²
μ¦, νκ° κ²°κ³Όκ° νμν λ κ°μ§ νκ°λ₯Ό λ¦μΆλ κΈ°λ²μ μ§μ° νκ° λΌκ³ νλ€.μ μμ μ ν¨μλ λ°μ΄ν° μλΉμμ
for ... of
λ λ°°μ΄ λμ€νΈλμ²λ§ ν λΉ λ±μ΄ μ€ν λκΈ° μ΄μ κΉμ§ λ°μ΄ν°λ₯Ό μμ±νμ§ μμ΅λλ€.λ΄λΆμμ nextλ©μλλ₯Ό νΈμΆνλλ° λ°λ‘ μ΄λ λ°μ΄ν°κ° μμ± λ¨
μ§μ° νκ°λ₯Ό μ¬μ©νλ©΄ λΆνμν λ°μ΄ν°λ₯Ό 미리 μμ±νμ§ μκ³ , νμν λ°μ΄ν°λ₯Ό νμν μκ°μ μμ±νλ―λ‘ λΉ λ₯Έ μ€ν μλλ₯Ό κΈ°λν μ μκ³ λΆνμν λ©λͺ¨λ¦¬λ₯Ό μλΉνμ§ μμ΅λλ€.
'javascript > π study' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[7μ£Όμ°¨ μ€ν°λ]35μ₯-λμ€νΈλμ²λ§ ν λΉ (0) | 2022.03.27 |
---|---|
[7μ£Όμ°¨ μ€ν°λ]35μ₯-μ€νλ λ λ¬Έλ² (0) | 2022.03.27 |
[7μ£Όμ°¨ μ€ν°λ]33μ₯-Symbol (0) | 2022.03.27 |
[5μ£Όμ°¨ μ€ν°λ]26μ₯-ES6 ν¨μ μΆκ° κΈ°λ₯ (0) | 2022.03.27 |
[5μ£Όμ°¨ μ€ν°λ]25μ₯-ν΄λμ€ (0) | 2022.03.27 |
λκΈ