您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页es6 Iterator迭代器

es6 Iterator迭代器

来源:五一七教育网

Iterator迭代器

它的作用一共有三个:

  • 第一是为各种数据结构,提供一个统一的、简便的访问接口
  • 第二使得数据结构的成员能够按某种次序排列
  • 第三ES6创造了一种新的遍历命令for…of循环,Iterator接口主要供for…of循环

1.Iterator原理解释
2.给对象添加iterator
一、iterator原理解释
我们先简单写一个数组,然后通过for of 遍历

        let arr = ["aaa","bbb","ccc"];
        for(let i of arr){
            console.log(i)
        }
        console.log(arr)

我们点开这个数组的原型,就会发现其中包含了一个名为 Symbol.iterator的方法

        let arr = ["aaa","bbb","ccc"];
        for(let i of arr){
            console.log(i)
        }
        console.log(arr)
        let iter = arr[Symbol.iterator]()
        console.log(iter)
        console.log(iter.next())
        console.log(iter.next())
        console.log(iter.next())
        console.log(iter.next())

  • Array
  • Set
  • Map
  • String
  • arguments对象
  • NodeList对象
    拿字符串测试以下是否具有iterator接口
        let arr = "starry";
        for(let i of arr){
            console.log(i)
        }
        console.log(arr)
        let iter = arr[Symbol.iterator]()
        console.log(iter)
        console.log(iter.next())
        console.log(iter.next())
        console.log(iter.next())
        console.log(iter.next())

       let obj = {
        0:"aaa",
        1:"bbb",
        2:"ccc",
        // length:3,
        // [Symbol.iterator]: Array.prototype[Symbol.iterator]
       }
       for(let i of obj){
        console.log(i) //报错
       }

        let obj = {
            code: 200,
            name: "starry",
            list: [1, 2, 3, 4]
        }
        for (let i of obj) { // 报错
            console.log(i) 
        }

上面的代码,直接for of 肯定会报错,假如我们想要遍历list的内容怎么办,也许你会说,直接obj.list就可以实现遍历,但是如果obj是别人私有的库呢,list是一个私有属性呢?所以转换身份,我们作为一个JS库开发者,写了一个对象,想让别人轻松使用for of 遍历自己对象的内容,就需要自己手动写一个iterator。

        let obj = {
            code: 200,
            name: "starry",
            list: ["A", "B", "c"],
            [Symbol.iterator](){
                let index = 0;
                return {
                    next:() => { // 使用箭头函数改变this指向
                        return {value:this.list[index++],done: index === (this.list.length+1) ? true : false}
                        // +1是因为迭代到C的时候index就已经是3了,不加1done为true就不会打印c了
                    }
                }
            }
        }
        for(let i of obj){
            console.log(i)
        }
        let iter = obj[Symbol.iterator]()
        console.log(iter.next())
        console.log(iter.next())
        console.log(iter.next())
        console.log(iter.next())

        let obj = {
            code: 200,
            name: "starry",
            list: ["A", "B", "c"],
            [Symbol.iterator](){
                let index = 0;
                return {
                    next:() => {
                        return {value:this.list[index++],done: index === (this.list.length+1) ? true : false}
                    }
                }
            }
        }
        console.log(...obj) // A B c

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务