// 배열 순회 const list = [1, 2, 3]; for (var i = 0; i < list.length; i++) { console.log(list[i]); } // 유사 배열 순회 const str = "abc"; for (var i = 0; i < str.length; i++) { console.log(str[i]); }
// 1 // 2 // 3 // a // b // c
for of
ES6에선 for of문이 추가되어 좀 더 명령형에서 선언형으로 바뀌었다. 인덱스로 직접 접근할 수 없는 리스트도 순회할 수 있다.
IteratorResult 객체는 done: boolean과 value: any 프로퍼티를 - 가진다.
이전 next 메서드 호출의 결과로 done 값이 true를 리턴했다면, 이후 호출에 대한 done 값도 true여야 한다.
Well-formed iterable
Iterator면서 Iterable인 객체를 Well-formed iterable이라고 한다. 즉 이터레이터의 이터러블이 자기 자신을 반환하면 Well-formed iterable이다.
Iterable/Iterator 프로토콜
Iterable을 for…of, 전개 연산자 등과 함께 동작하도록 한 규약이다.
for of의 동작원리
for of는 Iterable 객체에 사용할 수 있다.
for of를 호출하게 되면 Symbol.iterator를 통해 Iterator를 반환한다.
즉 for of는 Iterable/Iterator 프로토콜에 따라 동작한다.
1 2 3 4 5 6 7
const list = [1, 2, 3]; for (const a of list) { // for of는 Iterable/Iterator 프로토콜에 따라 동작한다. // 즉 반환된 Iterator의 value를 a로 참조한다. // done이 true가 되면 반복문을 빠져나온다. console.log(a); }
따라서 코드를 다음과 같이 수정할 수 있다.
1 2 3 4 5 6 7
let list = [1, 2, 3]; let iterator = list[Symbol.iterator](); while (1) { const { value, done } = iterator.next(); if (done === true) break; console.log(value); }
const map = newMap([ ["a", 1], ["b", 2], ["c", 3], ]); for (const a of map.keys()) console.log(a); // Map,Set의 key를 value로 하는 Iterator를 반환하는 메서드이다. // a // b // c for (const a of map.values()) console.log(a); // Map,Set의 value를 value로 하는 Iterator를 반환하는 메서드이다. // 1 // 2 // 3 for (const a of map.entries()) console.log(a); // Map,Set 전체를 value로 하는 Iterator를 반환하는 메서드이다. // ['a',1] // ['1',2] // ['1',3]
const a=[1,2=]; console.log([...a,...[3,4]]) ///[1,2,3,4]; a[Symbol.iterator]=null; console.log([...a,...[3,4]]) // Uncaught TypeError: a is not iterable
Iterable 프로토콜을 따르고 있기 때문에 Map,Set과 같은 여러 Iterable객체에 적용된다.