一、作用

  (1)為各種“集合”的數據結構,提供一個統一的、簡便的訪問接口

Object 正是因為無法確認屬性的遍歷的順序,所以沒有部署Iterator接口)

  (3)使得“集合”數據結構能運用for....of循環遍歷,Iterator 接口主要供for...of消費。

二、原理

本質是一個指針對象),不斷調用next方法,返回一個包含value和done的對象

var it = makeIterator(['a','b']);

        console.dir(it.next());
        console.dir(it.next());
        console.dir(it.next());

        function makeIterator(arr){
            let index = 0;

            return {
                next: function(){
                    return index < arr.length ? 
                        {value:arr[index++],done:false} : {value:undefined,done:true};
                }
            };
        }

 

三、具備Iterator接口的數據結構

並不是所有都可以,不行的對象,可以通過Array.from() 轉化為數組)

let arrayLike = { length: 2, 0: 'a', 1: 'b' };

// 報錯
for (let x of arrayLike) {
  console.log(x);
}

// 正確
//Array.from():從一個類似數組或可迭代對象創建一個新的,淺拷貝的數組實例

for (let x of Array.from(arrayLike)) {
  console.log(x);
}

 

    (2)特徵:具有 Symbol.iterator 屬性(本身是一個遍歷器生成函數,一執行,返回一個遍歷器)

const set = new Set("efe");

        const it = set[Symbol.iterator]();
        console.dir(it.next());
        console.dir(it.next());
        console.dir(it.next());

 

四、調用場合

  (1)解構賦值

const arr = ['a','b'];
        [x,y] = arr;
        console.log(x);  //a
        console.log(y);  //b

 

注:任何部署了interator的數據結構,都可以通過擴展運算符轉化為數組)

const set = new Set("efe");
        console.dir([...set]);

 

typescript 對象遍歷賦值_數據結構

  (3)yield *

  (4)for....of.....

五、還有方法return() 和 throw(),可選,不一定要部署

(1)return() : 遇到break或報錯會調用,返回一個對象

六、與其他遍歷語法的比較

(1)例子:數組   

      常用的遍歷方法: for    forEach    for....in.....     for....of.....

      其中,forEach 缺點是:

          即使使用break或return命令,還是不能跳出循環  (沒有剎車系統~~)。   

           for.....in......  缺點是:

          1、鍵名的類型是字符串;

          2、即使不是數字鍵名,同樣進行遍歷(所以for....in.....更適合在對象中使用,數組還是算了吧~~)

          3、亂序遍歷(先遍歷數字鍵名,其他按加入順序。到底還是因為所有鍵名都遍歷造成的問題,也難怪Object部署不了遍歷器~~)。       

          for....of....... 的優點是:

          剛好彌補了上面兩個的不足,既能隨意暫停遍歷,又能按順序進行遍歷

const arr = ['a','b'];
        arr.name = "zhengxiaona";
        arr.push('c');
        arr.age = "zhengxiaona";

        for(let i in arr){
            console.log(i);
        }

        console.log("..............");
        arr.forEach((item,index) => {
           console.log(`${item}......${index}`);
           return;
        });
        console.log("..............");

        for(let value of arr){
            console.log(value);
            break;
        }

 

typescript 對象遍歷賦值_數據結構_02