모던자바스크립트튜토리얼을 그대로 복기하며 공부해보겠읍니다 ..
iterable 객체란 배열을 일반화한 객체를 말한다. 이터러블이라는 개념을 사용하면 어떤 객체에든 for...of
반복문을 적용할 수 있다.
이터러블 객체를 만들어 보자.
let range = {
from : 1,
to : 5
};
//for..of가 동작하여 1,2,3,4,5가 출력될 수 있도록 만들어 보자..
range
를 이터러블로 만들려면 객체에 symbol.iterator
(특수 내장 심볼)이라는 메서드를 추가해야 한다.
for..of
가 시작되자마자 Symbol.iterator
를 호출. Symbol.iterator
는 반드시 이터레이터(메서드 next
가 있는 객체)를 반환해야 함.
이후 for..of
는 반환된 객체(이터레이터)만을 대상으로 동작함.
for..of
에 다음 값이 필요하면, for..of
는 이터레이터의 next()
메서드를 호출
next()
의 반환 값은 {done : Boolean, value : any}
와 같은 형태이어야 함.
let range = {
from : 1,
to : 5
};
range[Symbol.iterator] = function(){
return{
current : this.from,
last : this.to,
next(){
if(this.current <= this.last){
return {done : false, value : this.current++ }
} else {
return {done : true };
}
}
};
};
for (let num of range) {
alert(num); //1, then 2, 3, 4, 5
👉🏻 이터레이터 객체와 반복 대상인 객체를 분리하는 것이 핵심이다.
range
엔 메서드 next()
가 없다.range[Symbol.iterator]()
를 호출해서 만든 '이터레이터' 객체와 이 객체의 메서드 next()
에서 반복에 사용될 값을 만들어 낸다.for (let char of "test") {
// 글자 하나당 한 번 실행됩니다(4회 호출).
alert( char ); // t, e, s, t가 차례대로 출력됨
}
let str = "Hello";
// for..of를 사용한 것과 동일한 작업을 합니다.
// for (let char of str) alert(char);
let iterator = str[Symbol.iterator]();
while (true) {
let result = iterator.next();
if (result.done) break;
alert(result.value); // 글자가 하나씩 출력됩니다.
}
Symbol.iterator
가 구현된 객체length
프로퍼티가 있어서 배열처럼 보이는 객체👉🏻 이터러블과 유사배열은 대개 배열이 아니기 때문에, 배열 메서드들을 지원하지 않는다.
이들에게 배열 메서드를 적용하려면? ->
범용 메서드 Array.from
은 이터러블이나 유사 배열을 받아 '진짜' Array
를 만들어 준다.
let arrayLike = {
0: "Hello",
1: "World",
length: 2
};
let arr = Array.from(arrayLike); // (*)
alert(arr.pop()); // World
👉🏻 Array.from엔 '매핑' 함수를 선택적으로 넘겨줄 수 있다.
Array.from(obj [, mapFn, thisArg])
mapFn
을 두 번째 인수로 넘겨주면, 새로운 배열에 obj
요소들을 추가하기 전에 각 요소를 대상으로 mapFn
을 적용할 수 있다. 세 번째 인수 thisArg
는 각 요소의 this를 지정할 수 있도록 해준다.
📚 모던 자바스크립트 튜토리얼