for ...of문
Spread 문법의 피연산자
[Symbol.iterator]();
배열
,문자열
,arguments객체
,프로토타입체인에 의해 상속된 객체
for ...of문
에서 순회 가능Spread
문법의 대상으로 사용 가능// 배열은 Symbol.iterator 메소드를 소유,따라서 배열은 이터러블 프로토콜을 준수한 이터러블이다.
const array = [1, 2, 3];
console.log(Symbol.iterator in array); // true
// 이터러블 프로토콜을 준수한 배열은 for...of 문에서 순회 가능
for (const item of array) {
console.log(item);
}
// 일반 객체는 Symbol.iterator 메소드를 소유하지않음, 따라서 일반 객체는 이터러블 프로토콜을 준수한 이터러블이 아니다.
const obj = { a: 1, b: 2 };
console.log(Symbol.iterator in obj); // false
// 이터러블이 아닌 일반 객체는 for...of 문에서 순회할 수 없다.
// TypeError: obj is not iterable
for (const p of obj) {
console.log(p);
}
next()
: 이터러블을 순회하며 value,done 프로퍼티
를 갖는 이터레이터 리절트(result)객체를 반환
next()
메소드는 이터러블의 각 요소를 순회하기 위한 포인터 역할result.value
: 현재 순회 중인 이터러블 값 반환 result.done
: 이터러블의 순회 완료 여부 반환// 배열은 이터러블 프로토콜을 준수한 이터러블이다.
const array = [1, 2, 3];
// Symbol.iterator 메소드는 이터레이터를 반환한다.
const iterator = array[Symbol.iterator]();
// 이터레이터 프로토콜을 준수한 이터레이터는 next 메소드를 갖는다.
console.log('next' in iterator); // true
// 이터레이터의 next 메소드를 호출하면 value, done 프로퍼티를 갖는 이터레이터 리절트 객체를 반환한다.
// next 메소드를 호출할 때 마다 이터러블을 순회하며 이터레이터 리절트 객체를 한단계씩 반환한다.
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} // 순회완료
빌트인 이터러블
: 이터레이션 프로토콜을 준수하는 이터러블 즉, 이터러블은 데이터 공급자 역할
Array, String, Map, Set, TypedArray(Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array), DOM data structure(NodeList, HTMLCollection), Arguments
for...of문
,Spread문법
이터러블
// 배열
for (const item of ['a', 'b', 'c']) {
console.log(item);
}
// 문자열
for (const letter of 'abc') {
console.log(letter);
}
// Map
for (const [key, value] of new Map([['a', '1'], ['b', '2'], ['c', '3']])) {
console.log(`key : ${key} value : ${value}`); // key : a value : 1 ...
}
// Set
for (const val of new Set([1, 2, 3])) {
console.log(val);
}
// [Symbol.iterator](): Iterator{ next(): {value, done}};
// 0부터 10이하까지 숫자의 2배를 순회하는 이터레이터(반복자) 만들기!
const multiple = {
[Symbol.iterator]() {
const max = 10;
let num = 0;
//이터레이터 오브젝트 반환
return {
//넥스트함수
next() {
//value와 done 반환
return { value: num++ * 2, done: num > max };
},
};
},
};
for (const num of multiple) {
console.log(num);
}
// [Symbol.iterator](): Iterator{ next(): {value, done}};
// 0부터 10이하까지 숫자의 2배를 순회하는 이터레이터(반복자) 만들기!
//초기값,최대값,콜백함수
function makeIterable(initialValue, maxValue, callback) {
return {
[Symbol.iterator]() {
let num = initialValue;
return {
next() {
return { value: callback(num++), done: num > maxValue };
},
};
},
};
}
const multiple = makeIterable(0, 10, (n) => n * 2);
for (const num of multiple) {
console.log(num);
}
const single = makeIterable(0, 10, (n) => n);
for (const num of single) {
console.log(num);
}