본문 바로가기
Web/JavaScript

[JavaScript] 이터레이터(Iterator) & 이터러블(Iterable)

by coding-choonsik 2023. 4. 19.
728x90
반응형
SMALL

1. 이터레이터(Iterator)

  • 반복 처리가 가능한 객체
  • 내부적으로 next() 메서드를 가지며 next()메서드는 IteratorResult 객체 value와 done이라는 프로퍼티를 가진 객체를 반환

 


2. 이터러블(Iterable)

  • 반복이 가능한 객체
  • Symbol.Iterator 메서드가 있어야 하며 Symbol.Iterator는 이터레이터 객체를 반환해야 함
  • String, Array, Map, Set...등 객체
  • for 문법으로 반복이 가능
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>이터러블</title>
</head>
<body>
    <h2>이터러블</h2>
    <script>
        const arr = [1,2,3,4,5] 
        console.log(arr.values())    // 배열의 각 요소에 대한 값을 포함하는 새로운 배열 이터레이터(iterator)를 반환
        console.log(arr.entries())  // 각 요소에 대한 인덱스와 값을 포함하는 새로운 배열 이터레이터(iterator)를 반환
        console.log(arr.keys())    // 배열의 각 요소에 대한 인덱스를 포함하는 새로운 배열 이터레이터(iterator)를 반환

        const iterator = arr.values()   // 값에 대한 이터레이터
        while(true){
            const item = iterator.next()
            if(item.done) break;
            console.log(item.value)
        }
        console.log('-----')
        for(let item of arr){    
            console.log(item)
        }
    </script>
</body>
</html>

 


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>이터러블2</title>
</head>
<body>
    <h2>이터러블2</h2>
    <script>
        function iter(){
            let index = 0
            let data = [1,2,3,4]
            return {
                next(){
                    if(index < data.length){      // 인덱스가 arr의 길이보다 작을때까지만 done:false
                        return {value:data[index++], done:false}  // index의 값이 1씩 증가
                    }else{
                        return {value:undefined, done:true}
                    }
                }
            }
        }
        let i = iter()
        console.log(i.next())  // value:1, done:false
        console.log(i.next())  // value:2, done:false
        console.log(i.next())  // value:3, done:false
        console.log(i.next())  // value:4, done:false
        console.log(i.next())  // value:undefined, done:true
    </script>
</body>
</html>

 

 

 


MDN: Itreation

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Iteration_protocols

 

Iteration protocols - JavaScript | MDN

ECMAScript 2015 (ES6)에는 새로운 문법이나 built-in 뿐만이 아니라, protocols(표현법들)도 추가되었습니다. 이 protocol 은 일정 규칙만 충족한다면 어떠한 객체에 의해서도 구현될 수 있습니다.

developer.mozilla.org

 

728x90
반응형
LIST