iterator是什么东西

107 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情

前言

干了几天前端了,始终没有深度了解iterator接口,深感羞愧,所以今天趁着早自己,重新梳理一下这个知识点

iterator概念

iterator是es6新增的for...of 语法的消费,也是说for...of语法全靠iterator接口支持,如果一个数据结构没有iterator就没办法使用for...of语法遍历,反之就可以 遍历器对象本质上就是一个指针对象,每次调用都会移动指针到下一个位置,当指针所指位置为空,就表示遍历结束,否者可以一直遍历下去。

iterator的作用,就是为了for...of存在。es6规定,默认的iterator接口部署到了Symbaol.iterator属性上

模拟一个iterator

数组是默认有iterator接口的,对象默认没有,也就是说数组是可遍历的,对象是不可遍历的 如下

image.png 那给对象一个Symbal.iterator属性,对象就可以被遍历了,但是Symbal.iterator的值必须是一个函数,并且返回值是一个有next属性的对象,next属性值也必须是一个对象,对象里可以包含value和done,如果未结束可以没有done,因为在undefined会默认当成false, for...of循环会自动调用Symbol.iterator接口函数,得到遍历器对象,并在首次执行遍历器对象的next方法,如果返回的对象done为true,for...of循环结束,不会进入代码块。无输出

const obj = {
    [Symbol.iterator]: function () {
        return {
            next: function () {
                return {
                    value: 1,
                    done: true
                };
            }
        };
    }
};
for (let i of obj) {
    console.log(i);
}
// 什么都没打印

如果返回的对象的done为false,就把返回对象的value赋值给 i ,然后进入代码块执行代码块语句,执行完毕,再一次执行遍历器对象的next方法,直到这个next方法返回的对象的done为true为止 下面会一直输入1,永远不会停止,直到关闭程序

const obj = {
    [Symbol.iterator]: function () {
        return {
            next: function () {
                return {
                    value: 1,
                    done: false
                };
            }
        };
    }
};
for (let i of obj) {
    console.log(i);
}

所以想要控制遍历器的次数,就必须有个指针,下面的方法可以让它只遍历10次就结束,这也充分说明只会执行一次Symbal.iterator函数,后面调用的next都是这个函数返回的对象,不是每次都是新的

const obj = {
    [Symbol.iterator]: function () {
        let i = 0;
        return {
            next: function () {
                if (i < 10) {
                    i++;
                    return {
                        value: 1,
                        done: false
                    };
                } else {
                    return {
                        done: true
                    }
                }

            }
        };
    }
};
for (let i of obj) {
    console.log(i);
}

end

iterator原来不过如此.