Skip to content

Latest commit

Β 

History

History
291 lines (221 loc) Β· 12.1 KB

File metadata and controls

291 lines (221 loc) Β· 12.1 KB

λͺ©μ°¨

34.1 μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œ

❗ μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ€ 순회 κ°€λŠ₯ν•œ (iterable) 데이터 μ»¬λ ‰μ…˜(자료ꡬ쑰)을 λ§Œλ“€κΈ° μœ„ν•΄ ECMAScript 사양에 μ •μ˜ν•˜μ—¬ 미리 μ•½μ†ν•œ κ·œμΉ™

  • ES6μ—μ„œλŠ” 순회 κ°€λŠ₯ν•œ 데이터듀을 μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” μ΄ν„°λŸ¬λΈ”λ‘œ ν†΅μΌν–ˆλ‹€.

🌿 μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œ

  • μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œ
    • μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ 객체λ₯Ό μ΄ν„°λŸ¬λΈ”μ΄λΌ ν•œλ‹€. μ΄ν„°λŸ¬λΈ”μ€ for…ofλ¬Έ 으둜 μˆœνšŒν•  수 있으며 μŠ€ν”„λ ˆλ“œ 문법과 λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ήμ˜ λŒ€μƒμœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.
  • μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œ
    • μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ 객체λ₯Ό μ΄ν„°λ ˆμ΄ν„°λΌ ν•œλ‹€. μ΄ν„°λ ˆμ΄ν„°λŠ” μ΄ν„°λŸ¬λΈ”μ˜ μš”μ†Œλ₯Ό νƒμƒ‰ν•˜κΈ° μœ„ν•œ 포인터 역할을 ν•œλ‹€.

34.1.1 μ΄ν„°λŸ¬λΈ”

  • Symbol.iteratorλ₯Ό ν”„λ‘œνΌν‹° ν‚€λ‘œ μ‚¬μš©ν•œ λ©”μ„œλ“œλ₯Ό 직접 κ΅¬ν˜„ν•˜κ±°λ‚˜ ν”„λ‘œν† νƒ€μž… 체인을 톡해 상속받은 객체
const isIterable = v => v !== null && typeof v[Symbol.iterator] === 'function';

// λ°°μ—΄, λ¬Έμžμ—΄, Map, Set 등은 μ΄ν„°λŸ¬λΈ”μ΄λ‹€.
isIterable([]);        // -> true
isIterable('');        // -> true
isIterable(new Map()); // -> true
isIterable(new Set()); // -> true
isIterable({});        // -> false
  • isIterableν•¨μˆ˜λŠ” vκ°€ μ΄ν„°λŸ¬λΈ” 객체인지 ν™•μΈν•˜λŠ” ν•¨μˆ˜
  • 첫번째 Falseλ₯Ό μ°ΎλŠ” &&μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬μ„œ vκ°€ null값이 μ•„λ‹ˆκ³  Symbol.iterator ν”„λ‘œνΌν‹°κ°€ ν•¨μˆ˜μΈ 경우λ₯Ό μ°ΎλŠ”κ²ƒ
const array = [1, 2, 3];

// 배열은 Array.prototype의 Symbol.iterator λ©”μ„œλ“œλ₯Ό μƒμ†λ°›λŠ” μ΄ν„°λŸ¬λΈ”μ΄λ‹€.
console.log(Symbol.iterator in array); // true

// μ΄ν„°λŸ¬λΈ”μΈ 배열은 for...of 문으둜 순회 κ°€λŠ₯ν•˜λ‹€.
for (const item of array) {
  console.log(item); // 1 2 3
}

// μ΄ν„°λŸ¬λΈ”μΈ 배열은 μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μ˜ λŒ€μƒμœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.
console.log([...array]); // [1, 2, 3]

// μ΄ν„°λŸ¬λΈ”μΈ 배열은 λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ήμ˜ λŒ€μƒμœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.
const [a, ...rest] = array;
console.log(a, rest); // 1, [2, 3]
  • Symbol.iterator λ©”μ„œλ“œλ₯Ό 직접 κ΅¬ν˜„ν•˜μ§€ μ•Šκ±°λ‚˜ 상속받지 μ•Šμ€ 일반 κ°μ²΄λŠ” μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ μ΄ν„°λŸ¬λΈ”μ΄ μ•„λ‹˜ β†’ μΌλ°˜κ°μ²΄λŠ” for..of문으둜 순회 X, μŠ€ν”„λ ˆλ“œ 문법과 λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ήμ˜ λŒ€μƒ X

34.1.2 μ΄ν„°λ ˆμ΄ν„°

  • μ΄ν„°λŸ¬λΈ”μ˜ Symbol.iterator λ©”μ„œλ“œκ°€ λ°˜ν™˜ν•œ μ΄ν„°λ ˆμ΄ν„°λŠ” next λ©”μ„œλ“œλ₯Ό κ°–λŠ”λ‹€.
// 배열은 μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ μ΄ν„°λŸ¬λΈ”μ΄λ‹€.
const array = [1, 2, 3];

// Symbol.iterator λ©”μ„œλ“œλŠ” μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•œλ‹€.
const iterator = array[Symbol.iterator]();

// Symbol.iterator λ©”μ„œλ“œκ°€ λ°˜ν™˜ν•œ μ΄ν„°λ ˆμ΄ν„°λŠ” next λ©”μ„œλ“œλ₯Ό κ°–λŠ”λ‹€.
console.log('next' in iterator); // true
  • next λ©”μ„œλ“œλŠ” μ΄ν„°λŸ¬λΈ”μ˜ 각 μš”μ†Œλ₯Ό μˆœνšŒν•˜κΈ° μœ„ν•œ 포인터 μ—­ν• 

  • μ΄ν„°λŸ¬λΈ”μ„ 순차적으둜 ν•œ 단계 μ”© μˆœνšŒν•˜λ©° 순회 κ²°κ³Όλ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ΄ν„°λ ˆμ΄ν„° 리절트 객체(iterator result object)λ₯Ό λ°˜ν™˜

// 배열은 μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ μ΄ν„°λŸ¬λΈ”μ΄λ‹€.
const array = [1, 2, 3];

// Symbol.iterator λ©”μ„œλ“œλŠ” μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•œλ‹€. μ΄ν„°λ ˆμ΄ν„°λŠ” next λ©”μ„œλ“œλ₯Ό κ°–λŠ”λ‹€.
const iterator = array[Symbol.iterator]();

// next λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ΄ν„°λŸ¬λΈ”μ„ μˆœνšŒν•˜λ©° 순회 κ²°κ³Όλ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ΄ν„°λ ˆμ΄ν„° 리절트 객체λ₯Ό
// λ°˜ν™˜ν•œλ‹€. μ΄ν„°λ ˆμ΄ν„° 리절트 κ°μ²΄λŠ” value와 done ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” 객체닀.
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 }

34.2 빌트인 μ΄ν„°λŸ¬λΈ”

  • ν‘œμ€€ 빌트인 객체의 빌트인 μ΄ν„°λŸ¬λΈ”
빌트인 μ΄ν„°λŸ¬λΈ” Symbol.iterator λ©”μ„œλ“œ
Array Array.prototype[Symbol.iterator]
String String.prototype[Symbol.iterator]
Map Map.prototype[Symbol.iterator]
Set Set.prototype[Symbol.iterator]
TypedArray TypedArray.prototype[Symbol.iterator]
arguments arguments[Symbol.iterator]
DOM μ»¬λ ‰μ…˜ NodeList.protytype[Symbol.iterator]
HTMLCollection.protytype[Symbol.iterator]

34.3 for…ofλ¬Έ

  • for...of문은 μ΄λŸ¬ν„°λΈ”μ„ μˆœνšŒν•˜λ©΄μ„œ μ΄ν„°λŸ¬λΈ”μ˜ μš”μ†Œλ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•œλ‹€.
  • for...inλ¬Έ 의 ν˜•μ‹κ³Ό λΉ„μŠ·ν•˜λ‹€

for λ³€μˆ˜μ„ μ–Έλ¬Έ of μ΄ν„°λŸ¬λΈ”){...}

for λ³€μˆ˜μ„ μ–Έλ¬Έ in 객체 {...}

  • for...in 문은 객체λ₯Ό μˆœνšŒν•˜λ©° ν”„λ‘œνΌν‹° ν‚€κ°€ μ‹¬λ²ŒμΈ ν”„λ‘œνΌν‹°λŠ” μ—΄κ±°ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • for...of문은 λ‚΄λΆ€μ μœΌλ‘œ μ΄ν„°λ ˆμ΄ν„°μ˜ next λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ΄ν„°λŸ¬λΈ”μ„ μˆœνšŒν•˜λ©° next λ©”μ„œλ“œκ°€ λ°˜ν™˜ν•œ μ΄ν„°λ ˆμ΄ν„° 리절트 객체의 value ν”„λ‘œνΌν‹° 값을 λ³€μˆ˜μ— ν• λ‹Ήν•œλ‹€. 리절트 객체의 done ν”„λ‘œνΌν‹° 값이 false 이면 μ΄ν„°λŸ¬λΈ”μ˜ 순회λ₯Ό κ³„μ†ν•˜κ³  μ•„λ‹ˆλ©΄ 순회λ₯Ό μ€‘λ‹¨ν•œλ‹€.
// μ΄ν„°λŸ¬λΈ”
const iterable = [1, 2, 3];

// μ΄ν„°λŸ¬λΈ”μ˜ Symbol.iterator λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ΄ν„°λ ˆμ΄ν„°λ₯Ό μƒμ„±ν•œλ‹€.
const iterator = iterable[Symbol.iterator]();

for (;;) {
  // μ΄ν„°λ ˆμ΄ν„°μ˜ next λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ΄ν„°λŸ¬λΈ”μ„ μˆœνšŒν•œλ‹€. μ΄λ•Œ next λ©”μ„œλ“œλŠ” μ΄ν„°λ ˆμ΄ν„° 리절트 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.
  const res = iterator.next();

  // next λ©”μ„œλ“œκ°€ λ°˜ν™˜ν•œ μ΄ν„°λ ˆμ΄ν„° 리절트 객체의 done ν”„λ‘œνΌν‹° 값이 true이면 μ΄ν„°λŸ¬λΈ”μ˜ 순회λ₯Ό μ€‘λ‹¨ν•œλ‹€.
  if (res.done) break;

  // μ΄ν„°λ ˆμ΄ν„° 리절트 객체의 value ν”„λ‘œνΌν‹° 값을 item λ³€μˆ˜μ— ν• λ‹Ήν•œλ‹€.
  const item = res.value;
  console.log(item); // 1 2 3
}

34.4 μ΄ν„°λŸ¬λΈ”κ³Ό μœ μ‚¬ λ°°μ—΄ 객체

  • μœ μ‚¬ λ°°μ—΄ 객체 = 마치 λ°°μ—΄μ²˜λŸΌ 인덱슀둜 ν”„λ‘œνΌν‹° 값에 μ ‘κ·Όν•  수 있고 length ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” 객체
  • length ν”„λ‘œνΌν‹°λ₯Ό κ°–κΈ° λ•Œλ¬Έμ— for문으둜 순회 κ°€λŠ₯
  • 인덱슀λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 숫자 ν˜•μ‹μ˜ λ¬Έμžμ—΄μ„ ν”„λ‘œνΌν‹° ν‚€λ‘œ κ°€μ§€λ―€λ‘œ λ°°μ—΄μ²˜λŸΌ 인덱슀둜 ν”„λ‘œνΌν‹° 값에 μ ‘κ·Ό κ°€λŠ₯
  • μ΄ν„°λŸ¬λΈ”μ΄ μ•„λ‹Œ 일반 객체 β†’ Symbol.iterator λ©”μ„œλ“œκ°€ μ—†κΈ° λ•Œλ¬Έμ— for...of문으둜 순회 X
// μœ μ‚¬ λ°°μ—΄ 객체
const arrayLike = {
  0: 1,
  1: 2,
  2: 3,
  length: 3
};

// μœ μ‚¬ λ°°μ—΄ κ°μ²΄λŠ” length ν”„λ‘œνΌν‹°λ₯Ό κ°–κΈ° λ•Œλ¬Έμ— for 문으둜 μˆœνšŒν•  수 μžˆλ‹€.
for (let i = 0; i < arrayLike.length; i++) {
  // μœ μ‚¬ λ°°μ—΄ κ°μ²΄λŠ” 마치 λ°°μ—΄μ²˜λŸΌ 인덱슀둜 ν”„λ‘œνΌν‹° 값에 μ ‘κ·Όν•  수 μžˆλ‹€.
  console.log(arrayLike[i]); // 1 2 3
}
  • 단, arguments , NodeList , HTMLCollection 은 μœ μ‚¬ λ°°μ—΄ κ°μ²΄μ΄λ©΄μ„œ μ΄ν„°λŸ¬λΈ”μ΄λ‹€. ES6λΆ€ν„° μ΄ν„°λŸ¬λΈ”μ΄ λ„μž…λ˜λ©΄μ„œ μœ„μ˜ 3κ°€μ§€κ°€ μ΄ν„°λŸ¬λΈ”μ΄ λ˜μ—ˆλ‹€.
  • ν•˜μ§€λ§Œ μ΄ν„°λŸ¬λΈ”μ΄ 된 이후에도 LENGTH ν”„λ‘œνΌν‹°λ₯Ό κ°€μ§€λ©° 인덱슀둜 μ ‘κ·Όν•  수 μžˆλŠ” κ²ƒμ—λŠ” 변함이 μ—†μœΌλ―€λ‘œ μœ μ‚¬λ°°μ—΄ κ°μ²΄μ΄λ©΄μ„œ μ΄ν„°λŸ¬λΈ” 인 것

4.5 μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ˜ ν•„μš”μ„±

Untitled

  • μ΄ν„°λŸ¬λΈ”μ€ 데이터 μ†ŒλΉ„μžμ— μ˜ν•΄ μ‚¬μš©λ˜λ―€λ‘œ 데이터 κ³΅κΈ‰μžμ˜ 역할을 ν•œλ‹€.
  • λ‹€μ–‘ν•œ 데이터 κ³΅κΈ‰μžκ°€ ν•˜λ‚˜μ˜ 순회 방식을 갖도둝 κ·œμ •ν•˜λ©° 데이터 μ†ŒλΉ„μžκ°€ 효율적으둜 λ‹€μ–‘ν•œ 데이터 κ³΅κΈ‰μžλ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ 데이터 μ†ŒλΉ„μžμ™€ 데이터 κ³΅κΈ‰μžλ₯Ό μ—°κ²°ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ 역할을 ν•œλ‹€.

34.6 μ‚¬μš©μž μ •μ˜ μ΄ν„°λŸ¬λΈ”

34.6.1 μ‚¬μš©μž μ •μ˜ μ΄ν„°λŸ¬λΈ” κ΅¬ν˜„

일반 객체λ₯Ό μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λ„λ‘ κ΅¬ν˜„ν•˜λ©΄ μ‚¬μš©μž μ •μ˜ μ΄ν„°λŸ¬λΈ”μ΄ λœλ‹€.

// ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ„ κ΅¬ν˜„ν•œ μ‚¬μš©μž μ •μ˜ μ΄ν„°λŸ¬λΈ”
const fibonacci = {
  // Symbol.iterator λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ—¬ μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œλ‹€.
  [Symbol.iterator]() {
    let [pre, cur] = [0, 1]; // "36.1. λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ή" μ°Έκ³ 
    const max = 10; // μˆ˜μ—΄μ˜ μ΅œλŒ€κ°’

    // Symbol.iterator λ©”μ„œλ“œλŠ” next λ©”μ„œλ“œλ₯Ό μ†Œμœ ν•œ μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•˜κ³ 
    // next λ©”μ„œλ“œλŠ” μ΄ν„°λ ˆμ΄ν„° 리절트 객체λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.
    return {
      next() {
        [pre, cur] = [cur, pre + cur]; // "36.1. λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ή" μ°Έκ³ 
        // μ΄ν„°λ ˆμ΄ν„° 리절트 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.
        return { value: cur, done: cur >= max };
      }
    };
  }
};

// μ΄ν„°λŸ¬λΈ”μΈ fibonacci 객체λ₯Ό μˆœνšŒν•  λ•Œλ§ˆλ‹€ next λ©”μ„œλ“œκ°€ ν˜ΈμΆœλœλ‹€.
for (const num of fibonacci) {
  console.log(num); // 1 2 3 5 8
}

34.6.2 μ΄ν„°λŸ¬λΈ”μ„ μƒμ„±ν•˜λŠ” ν•¨μˆ˜

μ΄ν„°λŸ¬λΈ”μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ λ§Œλ“€κΈ°

// ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ„ κ΅¬ν˜„ν•œ μ‚¬μš©μž μ •μ˜ μ΄ν„°λŸ¬λΈ”μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜. μˆ˜μ—΄μ˜ μ΅œλŒ€κ°’μ„ 인수둜 μ „λ‹¬λ°›λŠ”λ‹€.
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
}

34.6.3 μ΄ν„°λŸ¬λΈ”μ΄λ©΄μ„œ μ΄ν„°λ ˆμ΄ν„°μΈ 객체λ₯Ό μƒμ„±ν•˜λŠ” ν•¨μˆ˜

  • μ΄ν„°λŸ¬λΈ”μ„ μƒμ„±ν•˜λ €λ©΄ μ΄ν„°λŸ¬λΈ”μ˜ Symbol.iterator λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ•Όν•œλ‹€.
  • Symbol.iterator λ©”μ„œλ“œλŠ” thisλ₯Ό λ°˜ν™˜ν•˜λ―€λ‘œ next λ©”μ„œλ“œλ₯Ό κ°–λŠ” μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•œλ‹€.
// μ΄ν„°λŸ¬λΈ”μ΄λ©΄μ„œ μ΄ν„°λ ˆμ΄ν„°μΈ 객체. μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•˜λŠ” Symbol.iterator λ©”μ„œλ“œμ™€
// μ΄ν„°λ ˆμ΄μ…˜ 리절트 객체λ₯Ό λ°˜ν™˜ν•˜λŠ” next λ©”μ„œλ“œλ₯Ό μ†Œμœ ν•œλ‹€.
{
  [Symbol.iterator]() { return this; },
  next() {
    return { value: any, done: boolean };
  }
}

34.6.5 λ¬΄ν•œ μ΄ν„°λŸ¬λΈ”κ³Ό μ§€μ—° 평가

  • λ¬΄ν•œ μ΄ν„°λŸ¬λΈ” μƒμ„±ν•˜λŠ” ν•¨μˆ˜
// λ¬΄ν•œ μ΄ν„°λŸ¬λΈ”μ„ μƒμ„±ν•˜λŠ” ν•¨μˆ˜
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
  • μ΄ν„°λŸ¬λΈ”μ€ μ§€μ—° 평가λ₯Ό 톡해 데이터λ₯Ό 생성
  • μ§€μ—° 평가 β‡’ 평가 κ²°κ³Όκ°€ ν•„μš”ν•  λ•ŒκΉŒμ§€ 평가λ₯Ό λŠ¦μΆ”λŠ” 기법