第七章 迭代器和生成器
一.迭代器(循环是迭代器的基础)
1.1 很多内置类型都实现了Iterable接口(满足可迭代协议),就是可迭代对象
字符串
数组
映射
集合
arguments对象
NodeList等Dom集合类型
实现Iterable接口的都暴露了一个属性作为“默认迭代器”,这个属性就是Symbol.iterator,这个默认迭代器属性引用了一个迭代器工厂函数,调用这个函数就会返回一个新的迭代器。
let str = 'abc';
console.log(str[Symbol.iterator]); //返回了迭代器工厂函数
console.log(str[Symbol.iterator]()); //调用这个迭代器工厂函数,返回一个迭代器
怎么实现迭代的
迭代器API使用next()方法在可迭代对象中遍历数据,每next()一次,就会返回一个iteratorResult对象,这个对象里面包含了done和value这两个值,done就是做完了吗,返回true或者false,value就是返回的值。
let arr = ["foo","bar"]; //这是一个可迭代对象
let iter = arr[Symbol.iterator](); //调用工厂函数生成迭代
console.log(iter.next()); //{done:"false",value:"foo"}
console.log(iter.next()); //{done:"false",value:"bar"}
console.log(iter.next()); //{done:"true",value:"undefined"}
在写代码过程中用不带这个显示调用迭代器函数工厂,理解原理就行了,循环中会自动用的
二.生成器
生成器的形式是一个函数,函数名称前面加上一个星号(*)表示是一个生成器
yield关键字可以让生成器停止和开始执行,也是生成器最有用的地方
function *fn(){
yield 1;
yield 2;
yield 3;
};
for(const x of fn()){
console.log(x)
} //1 //2 //3 三次循环得出的结果
网友评论