es6解读6- Iterator 和 for...of 循环

作者: cd72c1240b33 | 来源:发表于2017-07-17 08:14 被阅读84次

    es6 Iterator 和 for...of 循环

    什么是Iterator接口

    • ES6中内置了一些Symbol,其中最重要的一个恐怕就是Symbol.iterator了,相当于迭代器的接口,只有对象里有这个symbol的属性,才可以认为此对象是可迭代的。
    • 我们先看一下规范中对这个symbol的描述:
      A method that returns the default Iterator for an object. Called by the semantics of the for-of statement.
    • js中哪些对象里实现了这个接口呢?常见的有Array,String,arguments,还有后面高级的数据结构,如Set,Map等。

    Iterator的基本用法

    for...of

    • for...of循环的过程,其实就是通过不断调用Iterator接口来达到这种形式;
    • 也就是说,不同的数据结构,通过for...of这种统一的形式,来达到读取不同数据结构的目标;但是背后的Iterator接口其实不同;

    数组自动帮我们带了iterator接口

    let arr=['hello','world'];
    let map=arr[Symbol.iterator]();
    console.log(map.next());
    console.log(map.next());
    console.log(map.next());
    

    ** Object {value: "hello", done: false};done代表,是否做完了所有操作,true:代表是; false:代表无,还有其他操作;**

    Object对象不是一个iterator,那么如何把它变成一个iterator呢?

    let obj={
       start:[1,3,2],
        end:[7,8,9],
        [Symbol.iterator](){
            let self=this;
            let index=0;
            let arr=self.start.concat(self.end);
            let len=arr.length;
            return {
                next (){
                    if(index<len){
                        return {
                            value:arr[index++],
                            done:false
                        }
                    }else{
                        return {
                            value:arr[index++],
                            done:true
                        }
    
                    }
                }
            }
        }
    }
    for(let key of obj){
        console.log(key);
    }
    

    let...of的使用

    let arr=['hello','world'];
    for(let value of arr){
       console.log(value);
    }
    

    相关文章

      网友评论

        本文标题:es6解读6- Iterator 和 for...of 循环

        本文链接:https://www.haomeiwen.com/subject/jjqfkxtx.html