携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情
前言
干了几天前端了,始终没有深度了解iterator接口,深感羞愧,所以今天趁着早自己,重新梳理一下这个知识点
iterator概念
iterator是es6新增的for...of 语法的消费,也是说for...of语法全靠iterator接口支持,如果一个数据结构没有iterator就没办法使用for...of语法遍历,反之就可以 遍历器对象本质上就是一个指针对象,每次调用都会移动指针到下一个位置,当指针所指位置为空,就表示遍历结束,否者可以一直遍历下去。
iterator的作用,就是为了for...of存在。es6规定,默认的iterator接口部署到了Symbaol.iterator属性上
模拟一个iterator
数组是默认有iterator接口的,对象默认没有,也就是说数组是可遍历的,对象是不可遍历的 如下
那给对象一个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原来不过如此.