-
[JS] Symbol.iterator카테고리 없음 2022. 12. 15. 23:31
인프런 강의 정리
함수형 프로그래밍과 Javascript ES6+
이터러블/이터레이터 프로토콜
- 이터러블: 이터레이터를 리턴하는 [Symbol.iterator]() 를 가진 값
- 이터레이터: { value, done } 객체를 리턴하는 next() 를 가진 값
- 이터러블/이터레이터 프로토콜: 이터러블을 for...of, 전개 연산자 등과 함께 동작하도록한 규약Collection[Symbol.iterator]
- Array[Symbol.iterator] // values() { [native code] } - Set[Symbol.iterator] // values() { [native code] } - Map[Symbol.iterator] // entries() { [native code] }
// Java vs Javscript For문과 비교
// 이터러블은 for (const a of iterable) log(a); 로 순회참조가 가능하다.
//java //string String[] striings = []; for( String str : striings ) {} //hashMap Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator(); while(iterator.hasNext()) { Map.Entry<String, Integer> entry = iterator.next(); System.out.println("key" + entry.getKey()); System.out.println("value" + entry.getValue()); }
//javascript Iterator const strings = []; const collections = strngs[Symbol.iterator](); //const collections = new Set([]); //const collections = new Map([]); for (const collection of collections) { log(collections); // strings, set, map value } //map일 경우 //아래의 경우도 모두 Symbol.iterator로 반환된다. map.keys(); map.values(); map.entries();
Iterator를 반환하기위해 return에 [Symbol.iterator] 추가
const iterable = { [Symbol.iterator]() { let i = 1; return { next() { return i == 0 ? {done: true} : {value: i--, done: false}; }, [Symbol.iterator]() { //추가된부분 return this; } } } };
아래와 같이 사용이 가능해짐
let iterator = iterable[Symbol.iterator](); iterator.next(); for (const a of iterator) log(a);
전개 연산자
... 키워드를 붙이면 전체를 확인가능
console.log(...collections() )