for..of
을 사용할 수 있는 객체를 이터러블이라고 부릅니다.
Symbol.iterator
가 반드시 구현되어 있어야 합니다.obj[Symbol.iterator]
의 결과는 이터레이터라고 부릅니다. 이터레이터는 이어지는 반복 과정을 처리합니다.{done: Boolean, value: any}
을 반환하는 메서드 next()
가 반드시 구현되어 있어야 합니다. 여기서 done:true
은 반복이 끝났음을 의미하고 그렇지 않은 경우엔 value
가 다음 값이 됩니다.Symbol.iterator
는 for..of
에 의해 자동으로 호출되는데, 개발자가 명시적으로 호출하는 것도 가능합니다.Symbol.iterator
가 구현되어 있습니다.인덱스와 length
프로퍼티가 있는 객체는 유사 배열이라 불립니다. 유사 배열 객체엔 다양한 프로퍼티와 메서드가 있을 수 있는데 배열 내장 메서드는 없습니다.
명세서를 보면 대부분의 메서드는 ‘진짜’ 배열이 아닌 이터러블이나 유사 배열을 대상으로 동작한다고 쓰여 있는걸 볼 수 있습니다. 이 방법이 더 추상적이기 때문입니다.
Array.from(obj[, mapFn, thisArg])
을 사용하면 이터러블이나 유사 배열인 obj
를 진짜 Array
로 만들 수 있습니다. 이렇게 하면 obj
에도 배열 메서드를 사용할 수 있죠. 선택 인수 mapFn
와 thisArg
는 각 요소에 함수를 적용할 수 있게 해줍니다.
/* Symbol.iterator */
let range = {
from: 1,
to: 5,
[Symbol.iterator]() {
this.current = this.from;
return this;
},
next() {
if (this.current <= this.to) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
for (let num of range) {
console.log(num); // 1, then 2, 3, 4, 5
}
/////////////////////////////////////////////////
for (let char of "test") {
// 글자 하나당 한 번 실행됩니다(4회 호출).
console.log( char ); // t, e, s, t가 차례대로 출력됨
}
다른 것보다 for…of 와 for…in 의 차이점을 알게 되어서 기뻤다.
for..in 을 사용하면 객체나 배열의 인덱스를 반환하고, for…of 를 사용하면 객체나 배열의 실제값을 반환한다.
아직 실무에서는 순수 for문만 사용했는데, 어서 for..of 나 for..in 을 사용해보면 좋을 것 같다.