iterable하기 위한 충족 조건
: object는 iterator 메서드를 구현해야 함 (속성으로 Symbol.iterator을 가져야 함을 뜻함)
iterable
하다면 사용가능배열
, 유사배열(NodeList, arguments)
, String
, Map
, Set
은 모두 built-in interables
이다next 메서드
를 가져야 함value
: done이 true일 경우 undefined를 적거나 생략될 수 있음done
: boolean형태, 마지막 반복을 마치면 true, 반복할 작업이 남았다면 false// 배열은 iterable하다. 그렇다면 Symbol.iterator 메서드가 있어야 함
let fruit = ['apple', 'banana', 'cherry'];
console.log(typeof fruit[Symbol.iterator]); // function
// Symbol.iterator 타입이 function이라고 나왔다.
// 호출해보자
console.log(fruit[Symbol.iterator]()); // Object [Array Iterator] {}
// iterator가 담겨있다. 그럼 next 메서드가 있을 것이고 반환값은 value, done일 것이다.
// 변수에 담에 next를 호출해보자
let iter = fruit[Symbol.iterator]();
console.log(iter.next()); // { value: 'apple', done: false }
console.log(iter.next()); // { value: 'banana', done: false }
console.log(iter.next()); // { value: 'cherry', done: false }
console.log(iter.next()); // { value: 'undefined', done: true }
유사배열: 배열처럼 생겼지만 배열이 아니기 때문에 배열의 메서드 사용 못 함
📍예외) NodeList
, arguments
는 iterable함
// 유사배열객체 newJeans
let newJeans = {
0: '민지',
1: '하니',
2: '다니엘',
3: '해린',
4: '혜인',
length: 5,
}
for (let x of newJeans) {
console.log(x); // TypeError: newJeans is not iterable
}
// 유사배열객체를 Symbol.iterator 메서드를 추가해서 iterable하게 만들었다.
let newJeans = {
0: '민지',
1: '하니',
2: '다니엘',
3: '해린',
4: '혜인',
length: 5,
[Symbol.iterator]() {
const max = this.length;
let i = 0;
let val = this;
return {
next() {
return { value: val[i++], done: i > max, };
}
};
}
}
for (let x of newJeans) {
console.log(x);
}
/*
(출력값)
민지
하니
다니엘
해린
혜인
*/
next
메서드를 가짐.value
와 done
이 객체를 반환done 값은 true
, value 값은 undefined
가 됨https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Iteration_protocols