15 Iterator 와 for 방법

5207 단어
Iterator 개념
스 트 리밍 기 는 본질 적 으로 포인터 대상 이다.
  • 옮 겨 다 니 는 인터페이스 가 설치 되 어 있어 야 옮 겨 다 닐 수 있다.스 트 리밍 인 터 페 이 스 는 [Symbol.iterator]
  • Iterator 역할
  • 각종 데이터 구조 에 통 일 된 액세스 인터페이스 제공
  • 데이터 구조의 구성원 들 이 특정한 순서에 따라 정렬 할 수 있 도록 한다
  • for of 에 인터페이스 제공
  • Iterator 스 트 리밍 과정
  • 포인터 대상 을 만 들 고 현재 데이터 구조의 시작 위 치 를 가리킨다
  • 포인터 대상 을 처음 호출 하 는 next 방법 은 데이터 구조의 첫 번 째 구성원 에 게 지침 을 가리 킬 수 있다.데이터 구 조 를 되 돌려 주 는 현재 구성원 은 구체 적 으로 valuedone 을 포함 하 는 대상 이다.
  • 포인터 대상 next 방법 을 계속 호출 하여 데이터 구조의 끝 위 치 를 가리 킬 때 까지
  • 기본 Iterator 인터페이스
    대상 에 Iterator 인터페이스 가 없습니다.
  • 원생 이 Iterator 인 터 페 이 스 를 갖 춘 데이터 구 조 는 다음 과 같다
  • .
  • Array
  • Set, 배열 과 유사 하지만 구성원 의 값 은 유일 하 다
  • Map, 유사 대상 이지 만 '키' 의 범 위 는 문자열 에 국한 되 지 않 고 각종 유형의 값 을 키 로 사용 할 수 있 습 니 다
  • String
  • TypedArray
  • 함수 의 arguments 대상
  • NodeList 대상 (클래스 배열 대상)
  • object 는 원생 Iterator 인 터 페 이 스 를 갖 추 지 못 하고 [Symbol.iterator] 에 배치 해 야 한다.생 성 된 모든 형식 은 [key,val]
  • //            Iterator   
    let obj = {
      0:'y',
      1: 'f',
      length: 2,
      [Symbol.iterator]() {
        const self = this;
        let index = 0;
        return {
          next() {
            if (index < self.length) {
              return {
                value: [index,self[index++]],
                done: false
              };
            } else {
              return { value: undefined, done: true };
            }
          }
        };
      }
    };
    //     Object  
    Object.prototype[Symbol.iterator] = function () {
    }
    

    스 트 리밍 기 를 통 해 포인터 구 조 를 실현 하 는 예
    //     
    //     
    function Obj(value) {
        this.value =value;
        this.next = null;
    }
    //       
    Obj.prototype[Symbol.iterator] = function () {
        var iterator = { next: next };
    
        var current = this;
        function next() {
            if (current) {
                val value = current.value;
                current = current.next;
                return { done: false, value: value }
            } else {
                return { done: true }
            }
        }
    
        return iterator;
    }
    var one = new Obj(1);
    var two = new Obj(2);
    var three = new Obj(3);
    
    one.next = two;
    two.next = three;
    
    for (var i of one) {
        console.log(i);
    }
    

    Iterator 생 성 방식
    var arr = [1,2,3];
    var iterator = arr[Symbol.iterator]();
    

    기본 호출 Iterator 인터페이스의 경우
  • 할당 해제
  • 배열 과 Set 재 구성 을 재 구성 할 때
  • 확장 연산 자
  • ... 확장 연산 자 사용
  • yield*
  • 기타 장소
  • for of
  • Array.from()
  • Map()
  • Set()
  • WeakMap()
  • WeakSet()
  • Promise.all()
  • Promise.race()
  • //     
    let set = new Set().add('a').add('b').add('c');
    let [x,y] = set;
    

    문자열 의 Iterator 인터페이스
    //              
    var str = 'hi';
    var iterator = str[Symbol.iterator]();
    
    iterator.next()  // { value: "h", done: false }
    iterator.next()  // { value: "i", done: false }
    iterator.next()  // { value: undefined, done: true }
    

    옮 겨 다 니 는 대상 의 return (), throw ()for of 에서 사용 break 또는 continue 미리 종료, 호출 return 방법
    //   ,        next     
    //           throw   return     
    function ite() {
        return {
            next() {
                return {done: false}
            },
            return() {
                file.close();
                return { done: true }
            }
        }
    }
    // throw      
    
    for of 순환
    배열
    // for in       ,           ,        
    var arr = [7,9,0];
    arr.foo = 'bar';
    for (let i in arr) {
        console.log(i);  // '0','1','2','foo'
    }
    // for of           
    for (let i of arr) {
        console.log(i);  // '7','9','0'
    }
    

    Set 와 Map 재 구성
    계산 생 성 된 데이터 구조
    배열, Set, Map 은 다음 세 가지 방법 을 배 치 했 습 니 다. 이 방법 들 은 모두 옮 겨 다 니 는 대상 으로 돌아 갑 니 다.
  • entries()
  • keys()
  • values()

  • 배열 과 유사 한 대상
    모든 유사 한 배열 의 대상 이 Iterator 인터페이스 가 있 는 것 은 아니다. Array.from 를 사용 하여 배열 로 바 꾸 고 다시 사용 할 수 있다 for of 방법
    대상
    일반 대상 은 직접 사용 할 수 없 음 for of, 잘못 신고 할 수 있 습 니 다.해결 방법:
  • 사용 Object.keys() 대상 속성 값 으로 구 성 된 배열 을 만 들 고 사용 for of
  • 다른 방법 으로 사용 Generator 대상 을 포장
  • 대상 실례 에 직접 배치 [Symbol.iterator] 할 수도 있 고 대상 원형 체인 에 배치 [Symbol.iterator] 할 수도 있다.클래스 배열 대상 [Symbol.iterator] 과 일반 대상 [Symbol.iterator] 을 배치 하 는 방법 이 다르다
  • //    Generator        
    function* entries(obj) {
        //     Object.keys   for in   
      for (let key of Object.keys(obj)) {
        yield [key, obj[key]];
      }
    }
    
    for (let [key, value] of entries(obj)) {
      console.log(key, '->', value);
    }
    

    좋은 웹페이지 즐겨찾기