1五、ES6的for...of遍歷iterator對象

一、iterator接口。

若是一個對象部署了iterator接口那就能被for...of 遍歷。而且for...of 只能遍歷部署了iterator接口的對象。以下對象:javascript

  • 數組。
  • 字符串。
  • arguments。
  • set容器。
  • map容器。

例子以下:java

let arr = ["aa",2,3,40];
    for (let i of arr){
        console.log(i);//aa 2 3 40
    }


    let str = "dsfe3e2";
    for (let i of str){
        console.log(i);//d s f e 3 e 2
    }
    
    function add() {
        for (let i of arguments){
            console.log(i);//1 2 3 45 234
        }
    }
    add(1,2,3,45,234);

二、iterator接口的本質。

咱們也能夠在一個自定義的對象上部署iterator接口,當使用for...of 遍歷某個對象時,實際上是調用這個對象的Symbol.iterator方法(Symbol.iterator是Symbol內置的一個Symbol值)。因此咱們只須要在對象上增長一個Symbol.iterator方法,這個對象就能被for...of 遍歷es6

let obj = {
        a : 1,
        [Symbol.iterator]: function* () { //遍歷器
            yield 1;
            yield* [2,3,4];
            yield 5;
        }
    };
    for (let i of obj){
        console.log(i);//1 2 3 4 5
    }

上面的代碼,obj對象中定義了一個名字爲Symbol.iterator的方法。使用for...of就會調用這個方法。數組

函數Symbol.iterator的聲明使用了function*,使得Symbol.iterator函數成爲一個generator,而且能夠在其中裏面使用yield關鍵字,obj的Symbol.iterator方法返回一個generator對象,經過next()依次調用。函數

更多詳細,參考http://es6.ruanyifeng.com/#docs/iteratorspa

相關文章
相關標籤/搜索