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

相关文章
相关标签/搜索