1.迭代器iterator
何为迭代,迭代就是遍历,遍历就是迭代
iterator是ES6的一种新的遍历机制,有两个核心
1)迭代器能快捷的访问数据,通过Symbol.iterator创建迭代器,通过迭代器的next()方法获取结果
2)迭代器是用于遍历数据结构的指针(数据库的游标)
2.使用迭代器
let arr = [1,2,3]
console.log(arr)
//输出arr 打开arr的原型 会发现上面有Symbol方法
//通过Symbol.iterator创建迭代器
const iter = arr[Symbol.iterator]()
console.log(iter)//done为是否迭代完成,false是未完成,true为迭代完成
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
控制台:
3.迭代器一般配合生成器使用
4.生成器(generator)
生成器:generator
generator函数 可以通过yield关键字 将函数挂起,为改变执行流提供了可能,同时为了做异步编程提供了方案。
//1.function后面 函数名之前有个*
//2.只能在函数内部使用yield表达式,让函数挂起
function* fn() {
console.log('one')
yield 2;
console.log('one')
yield 3;
console.log('one')
}
// 原型的原型有next()方法
let fun = fn()
console.log(fun.next())
console.log(fun.next())
console.log(fun.next())
function* increase(){
console.log('start')
// 注意:x不是yield '2'的返回值,它是next()调用,恢复当前yield()执行传入的实参
let x = yield '2';
console.log('one'+ x)
let y = yield "3";
console.log("two"+ y)
return x + y
}
let fn = increase()
console.log(fn.next())
console.log(fn.next(20))
console.log(fn.next(30))
总结:generator函数是分段执行的,yield语句是暂停执行,而next()是恢复执行
5.使用场景:
为不具备Interator接口的对象提供了遍历操作
function* objEntries(obj){
//获取对象所有的key保存到数组
let propKeys = Object.keys(obj)
for(let propkey of propKeys){
yield [propkey,obj[propkey]]
}
}
let obj = {
name: '小马哥',
age: 18,
sex: '男'
}
obj[Symbol.iterator] = objEntries
console.log(obj)
for(let [key,val] of objEntries(obj)){
console.log(`${key}:${val}`)
}
——学问是异常珍贵的东西,从任何源泉吸收都不可耻。——阿卜·日·法拉兹