一、迭代器生成器--是什么
1.迭代器
- 特殊对象,具有一些专门为迭代过程设计的专有接口
- 迭代器对象都有一个next()方法,调用返回对象有两个属性value(下一个要返回的值)和done(没有更多可返回数据时返回true)
- 迭代器还会保存一个内部指针,每调用一次next()方法都会返回下一个可用的值
2.生成器
返回迭代器的函数,通过function关键字后的(*)表示,会用到关键字yield
每执行完一条yield语句函数会自动停止
function *createIterator(){
yield 1
yield 2
yield 3
}
let iterator = createIterator()
console.log(iterator.next().value) // 1
console.log(iterator.next().value) // 2
console.log(iterator.next().value) // 3
yield的使用限制--只能在生成器内部使用
function *createIterator(items){
items.forEach(function(){
// 语法错误
yield item + 1
})
}
这里表面看是在生成器内部,但是它与return关键字一样,二者不能穿透函数边界。嵌套函数的中的return语句不能作为外部函数的返回语句,此处嵌套函数中的yield会导致程序抛出语法错误。
1.生成器函数表达式
在function关键字和小括号中间添加*。不能用箭头函数创建生成器
2.生成器对象的方法
在函数名前加*
二、可迭代对象和for-of循环
可迭代对象具有Symbol.iterator属性。生成器默认会为Symbol.iterator属性赋值,通过生成器创建的迭代器都是可迭代对象。
for-of循环每次执行循环都会调用可迭代对象的next()方法,并将迭代器返回对象中的value存储。
1.访问默认迭代器
可以用Symbol.iterator访问对象默认的迭代器。可用它检测对象是否为可迭代对象
2.创建可迭代对象
默认情况下,开发者定义的对象都是不可迭代对象,如果给Symbol.iterator属性添加一个生成器,可以变成可迭代对象。
let collection = {
items:[],
*[Symbol.iterator](){
for(let item of this.items){
yield item
}
}
}
collection.items.push(1)
collection.items.push(2)
collection.items.push(3)
for(let x of collection){
console.log(x)
}
三、内建迭代器
将可迭代对象转换为数组,展开运算符是最简单的方法
1.集合对象迭代器
数组、Map集合、Set集合内建了以下三种迭代器
- entries() 返回一个迭代器其值为多个键值对
- values() 返回一个迭代器其值为集合的值
- keys() 返回一个迭代器其值为所有的键名 在for-of循环中没有显示指定则使用默认迭代器,数组和Set默认迭代器是values(),Map默认迭代器是entries()
2.字符串迭代器
用for-of的默认迭代器,使其操作字符而不是编码单元
3.NodeList迭代器
DOM标准中有一个NodeList类型代表页面文档的所有元素集合。DOM定义中的NodeList类型默认迭代器与数组的默认迭代器一致。