모든 코드는
<script></script>
안에서 작성한 코드 입니다.
//기존의 list 순회
const list = [1, 2, 3, 4]
for(var i = 0; i< list.length ; i++ ) {
log(list[i])
}
//ES6 순회 방법 , for..of
for(const a of list){
log(a)
}
//Arr
const arr = [1,2,3]
for(const a of arr )log(a)
//Set
const set = new Set([1,2,3])
for(const a of set )log(a)
//Map
const map = new Map ([['a', 1], ['b' ,2], ['c',3]])
for(const a of map.keys() log(a) // a, b, c
for(const a of map.values()log(a) //1, 2, 3
for(const a of map.entries() log(a)//['a', 1], ['b' ,2], ['c',3]
ES6 에서의 순회는 위에 순회하는 ES5 의 for 문이랑 같은 원리로 순회하는 것 이 아니다!!
for of 문은 Symbol.iterator
라는 symbol 이 있다. ES6에 추가됨. Symbol.iterator
은 어떤 객체의 키로 사용 될 수 있다.
const arr = [1, 2, 3]
log(arr[Symbol.iterator]) // 함수가 들어있음을 할 수 있다.
arr[Symbol.iterator] = null; // arr is not iterator
즉, Array & Set & Map 은 이터러블/이터레이터 프로토콜을 따른다.
arr[Symbol.iterator] // 함수가 들어 있음을 알수있다.
let iterator = arr[Symbol.iterator]();
iterator.next() // {vlue:1, done: false }
iterator.next() // {vlue:2, done: false }
iterator.next() // {vlue:3, done: false }
Arr, Set, Map 모두 같은 원리다.
//iterable 에 대해서 좀 더 정확히 이해할수 있는 예제
const iterable = {
[Symbol.iterator](){
let i = 3
return{
next() {
return i==0 ? {done: true }:{value:i--, done: false}
},
[Symbol.iterator]() { return this } // well-formed iterable
}
}
}
let iterator = iterable[Symbol.iterator]()
for (const a of iterable) log(a)
iterator 이면서 iterable인 객체를 well-formed iterable이라고 한다. 즉, 자기 자신의 상태를 기억할 수 있다는 뜻.
Ex)
const a = [1, 2]
log(...a) // 1 2
log([...a...[3, 4]]) // 1 2 3 4