ES6之Iterator 和 for...of 循環(huán)

一、概念

遍歷器(Iterator)是一種接口,為各種不同的數(shù)據(jù)結(jié)構(gòu)提供統(tǒng)一的訪問機制。任何數(shù)據(jù)結(jié)構(gòu)只要部署 Iterator 接口,就可以完成遍歷操作(即依次處理該數(shù)據(jù)結(jié)構(gòu)的所有成員)。

  • 作用:
    1)為各種數(shù)據(jù)結(jié)構(gòu),提供一個統(tǒng)一的、簡便的訪問接口;
    2)使得數(shù)據(jù)結(jié)構(gòu)的成員能夠按某種次序排列;
    3) ES6 創(chuàng)造了一種新的遍歷命令for...of循環(huán),Iterator 接口主要供for...of消費。
  • 實質(zhì):
    Iterator創(chuàng)建一個指針對象,指向當(dāng)前數(shù)據(jù)結(jié)構(gòu)的起始位置,不斷調(diào)用指針對象的next方法直到數(shù)據(jù)結(jié)構(gòu)結(jié)束位置,遍歷事先給定的數(shù)據(jù)結(jié)構(gòu)
var it = makeIterator(['a', 'b']);

it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }

function makeIterator(array) {
  var nextIndex = 0;
  return {
    next: function() {
      return nextIndex < array.length ?
        {value: array[nextIndex++], done: false} :
        {value: undefined, done: true};
    }
  };
}

二、 Symbol.iterator屬性:

一個數(shù)據(jù)結(jié)構(gòu)只要具有Symbol.iterator屬性,就可以認為是“可遍歷的

const obj = {
  [Symbol.iterator] : function () {
    return {
      next: function () {
        return {
          value: 1,
          done: true
        };
      }
    };
  }
};

原生具備 Iterator 接口的數(shù)據(jù)結(jié)構(gòu)如下:

  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函數(shù)的 arguments 對象
  • NodeList 對象

對象(Object)之所以沒有默認部署 Iterator 接口,是因為對象的哪個屬性先遍歷,哪個屬性后遍歷是不確定的,需要開發(fā)者手動指定。

三、遍歷器對象的 return(),throw()

遍歷器對象的next()方法是必須部署的,return()方法(必須返回一個對象)和throw()方法是否部署是可選的。return()方法的使用場合是,如果for...of循環(huán)提前退出,就會調(diào)用return()方法。如果一個對象在完成遍歷前,需要清理或釋放資源,就可以部署return()方法

function readLinesSync(file) {
  return {
    [Symbol.iterator]() {
      return {
        next() {
          return { done: false };
        },
        return() {
          file.close();
          return { done: true };
        }
      };
    },
  };
}

throw()方法主要是配合 Generator 函數(shù)使用,一般的遍歷器對象用不到這個方法。

四、for...of 循環(huán)

for...of循環(huán)內(nèi)部調(diào)用的是數(shù)據(jù)結(jié)構(gòu)的Symbol.iterator方法,for...in循環(huán),只能獲得對象的鍵名,for...of循環(huán),允許遍歷獲得鍵值

const arr = ['red', 'green', 'blue'];

for(let v of arr) {
  console.log(v); // red green blue
}

對于普通的對象,for...of結(jié)構(gòu)不能直接使用,會報錯,必須部署了 Iterator 接口后才能使用,可以使用for...in循環(huán)遍歷鍵名

let es6 = {
  edition: 6,
  committee: "TC39",
  standard: "ECMA-262"
};

for (let e in es6) {
  console.log(e);
}
// edition
// committee
// standard

for (let e of es6) {
  console.log(e);
}
// TypeError: es6[Symbol.iterator] is not a function
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容