Iterantion
ECMAScript 2015 (ES6)에는 새로운 문법이나 빌트인(Built-in) 뿐만이 아니라, 프로토콜(Protocols, 표현법들)도 추가되었습니다. 이 프로토콜은 일정 규칙만 충족한다면 어떠한 객체에 의해서도 구현될 수 있습니다
영상 강의
PART 1
예제
Iterable 프로토콜
Iterable 프로토콜의 조건은 다음과 같습니다.
[Symbol.iterator]
메서드를 소유해야 합니다.- Iterator 프로토콜에 준하는 객체를 반환해야 합니다.
사용자 정의 Iterable 객체 예시
const star4 = {
[Symbol.iterator]() {
let _star = Symbol('_star');
return {
[_star]: '',
next() {
if ( this[_star].length < 4 ) {
this[_star] += '*';
return {
value: this[_star],
done: false
};
} else {
return { done: true };
}
}
}
}
};
/* -----------------------------------
// 검토
------------------------------------ */
star4[Symbol.iterator]();
// 출력: {next: ƒ, Symbol(_star): ""}
[...star4];
// 출력: ["*", "**", "***", "****"]
for (let star of star4) {
console.log(star);
}
// 출력:
// *
// **
// ***
// ****
Iterator 프로토콜
Iterator 프로토콜의 조건은 다음과 같습니다.
- 인자를 받지 않는
next()
메서드를 소유해야 합니다. next()
메서드의 반환 값은 객체로value
,done
속성을 소유해야 합니다.done
은 반복이 종료될 경우true
, 종료되지 않을 경우false
여야 합니다.value
는 JavaScript의 모든 데이터 타입 설정이 가능합니다.
사용자 정의 Iterator 객체 예시
function iteratorMaker(array) {
let index = 0;
return {
next() {
if (index < array.length) {
return { done: false, value: array[index++] };
} else {
return { done: true };
}
}
}
}
/* -----------------------------------
// 검토
------------------------------------ */
const protocols = iteratorMaker(['iteration', 'iterable', 'iterator']);
// 출력: {next: ƒ}
protocols.next(); // {done: false, value: 'iteration'}
protocols.next(); // {done: false, value: 'iterable'}
protocols.next(); // {done: false, value: 'iterator'}
protocols.next(); // {done: true, value: undefined}
주의!
for..of문은 Iterable 프로토콜을 준수하는 객체만 순환 처리합니다.