es6 iterator 迭代器的學習總結

 =====================迭代器=========================
    背景知識:
    1. 什麼是迭代?
    從一個數據集合中按照一定的順序,不斷取出數據的過程

    2. 迭代和遍歷的區別?
    迭代強調的是依次取數據,並不保證取多少,也不保證把所有的數據取完
    遍歷強調的是要把整個數據依次全部取出

    3. 迭代器
    對迭代過程的封裝,在不同語言中有不同的表現形式,通常爲對象

    4. 迭代模式
    一種設計模式,用於同一迭代過程,並規範了迭代器規格:
      迭代器應該具有得到下一個數據的能力
      迭代器應該具有判斷是否還有後續數據的能力

    JS中的迭代器
     JS規定,如果一個對象具有next方法,並且 該方法返回一個對象,該對象的格式如下:
     {value: 值, done: 是否迭代完成} 
     例如:
      const obj = {
            next() {
                return { value: xxx, done: xxx }
            }
        } 

     則認爲該對象是一個迭代器

     next() 含義:
      next方法:用於得到下一個數據
      返回的對象:
        value: 下一個數據的值
        done: boolean,是否迭代完成

        例如: 數組的迭代器:
        // 迭代器創建函數
        function createIterator(arr) {
            const iterator = {
                i: 0,
                next() {
                    let result = {
                        value: arr[this.i],
                        hasDone: this.i >= arr.length,
                    }
                    this.i++;
                    return result;
                }
            }
            return iterator;
        }

        const arr = [1, 2, 3, 4, 5];
        const result = createIterator(arr);


        可迭代協議
         es6規定,如果一個對象具有知名符號屬性: Symbol.iterator, 並且屬性值是一個迭代器創建函數,
          則該對象是可迭代的(iterator)
         例如:
          const obj = {
            [Symbol.iterator]() {
                return {
                    next() {
                        return {
                            value: 1,
                            hasDone: false,
                        }
                    }

                }
            }
        }

     如何判斷一個對象是否可以迭代: 通過原型上去找是否含有 [Symbol.iterator] 知名符號屬性的方法
        es6中數組,已經做成了一個可迭代的對象:
        例如:
          const arr = [1,2,3,4,5,6];
          connst iterator = arr[Symbol.iterator]();
          iterator.next(); 可以一直執行
        
        dom中的許多類數組也是一個可迭代的對象:  

    如何遍歷迭代器:
          const arr = [1,2,3,4,5,6];
          connst iterator = arr[Symbol.iterator]();
          let result =  iterator.next();
          while(!result.done){
              const item = result.value;
              console.log(item) // 此處可以輸出所有的迭代器裏面的結果
              result = iterator.next();
          }

    es6 爲了統一迭代方法: 提出了for of 循環
        for of 循環用於遍歷可迭代對象, 格式如下:
        for(const item in iterable){
            // iterable 可迭代對象
            // item: 每一次迭代得到的數據
        }    
        
        for(const item of arr){
            console.log(item)// 等價於上面的while循環去調用next()方法
        }

        展開運算符與可迭代對象: 展開運算符可以作用與迭代對象,這樣,就可以輕鬆的將可迭代對象轉換爲數組
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章