for of和iterator

213 阅读1分钟
  • 一个数据结构只要部署了Symbol.iterator属性,就被视为具有 iterator 接口,就可以用for...of循环遍历它的成员(map、set、数组、类数组、Generator、字符串)

  • 模拟iterator

    function iterator(data) {
        let i = 0
        return {
            next: function () {
                return {
                    done: data.length <= i,
                    value: data.length > i ? data[i++] : undefined
                }
            }
        }
    }
    var arr = iterator([1, 2, 3])
    

    1620829053(1).png 传入的数据编译到scope中,通过调用对象中的next方法有序遍历数据。

  • 模拟for of

    function forOf(obj, cb) {
        // 生成迭代器对象
        let iterator = obj[Symbol.iterator]()
        let res = iterator.next()
        while (!res.done) {
            cb(res.value)
            res = iterator.next()
        }
    }
    forOf([5, 6, 7], function (data) {
        console.log(data);
    })
    

1620829887(1).png

  • 数组、Set、Map 部署了entires()、 keys()、 values()三个方法,分别遍历[键名, 键值]组成的数组、键名、键值

    let arr = ['a', 'b', 'c'];
    for (let pair of arr.entries()) {
      console.log(pair);
    }