Iteration
이터레이션 프로토콜에 대해서 공부해보자.

const array = [1,2,3]; console.log(Symbol.iterator in array); for (const item of array){ console.log(item); } /* 일반 객체는 이터레이션 프로토콜을 준수하지 않는다. Symbol.iterator 를 직접 메소드를 커스텀구현하면 일반 객체도 가능은 하다. */ const objectLiteral = { a: 10, b: 20}; console.log(Symbol.iterator in objectLiteral); // false for(const oL of objectLiteral){ console.log(p); }
/* Symbol.iterator 의 내부 변수는 외부로 전달이 불가능하다. 이 특성을 이용하여 다양한 구현이 가능하다. Symbol.iterator 메소드는 next 메소드를 소유한 이터레이터를 반환해야 한다. next 메소드는 이터레이터 리절트 객체를 반환하며 순회시 마다 호출이 된다. */ const fibonacci = { [Symbol.iterator]() { let [pre, cur] = [0, 1]; const max = 10; //return iterator return { next() { [pre, cur] = [cur, pre + cur]; return { value: cur, done: cur >= max }; } }; } }; // 반복문 에서의 사용 for (const num of fibonacci) { console.log(num); } // spread 문법 const arr = [...fibonacci]; console.log(arr); // [ 1, 2, 3, 5, 8 ] // destructuring const [first, second, ...rest] = fibonacci; console.log(first, second, rest); // 1 2 [ 3, 5, 8 ]const fibonacciFunc = function (max) { let [pre, cur] = [0, 1]; 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); }const fibonacciFunc = function (max) { let [pre, cur] = [0, 1]; /* Symbol.iterator 메소드와 next 메소드를 소유한 이터러블이면서 이터레이터인 객체를 반환 하려면 위 예지와 다르게 감싸는 구조가 아닌 별도의 프로퍼티로 구성하면 된다. */ return { [Symbol.iterator]() { return this; }, next() { [pre, cur] = [cur, pre + cur]; return { value: cur, done: cur >= max }; } }; }; let iter = fibonacciFunc(10); // 이터레이터로 활용되는 코드 console.log(iter.next()); // {value: 1, done: false} console.log(iter.next()); // {value: 2, done: false} console.log(iter.next()); // {value: 3, done: false} console.log(iter.next()); // {value: 5, done: false} console.log(iter.next()); // {value: 8, done: false} console.log(iter.next()); // {value: 13, done: true} iter = fibonacciFunc(10); // 이터러블로 활용되는 코드 for (const num of iter) { console.log(num); }const fibonacciFunc = function () { let [pre, cur] = [0, 1]; return { [Symbol.iterator]() { return this; }, next() { [pre, cur] = [cur, pre + cur]; return { value: cur }; } }; }; // 제약을 걸지 않으면 무한히 생성된다. for (const num of fibonacciFunc()) { if (num > 10000) break; console.log(num); } // 원하는 값만 취득하는 방식 const [f1, f2, f3] = fibonacciFunc(); console.log(f1, f2, f3); // 1 2 3
Last updated
