如何理解什么是迭代器,先理解下面一段代码,每一次执行函数publish,version值就会增加一次,这好比我们要发布一个软件或者APP、当我们需要更新软件时候,下次发布的版本就会覆盖前面发布的,每一次发布就形成一次迭代。
var version=0
function publish(){
version +=1
return version
}
publish() // 1
publish() // 2
1、迭代器
迭代器接受一个next方法,并返回一个value和done,当迭代到最后一个值时候,done则为true。
(1)、
function 发布器(){
return {
next:function(){}
}
}
1
(2)、
function 发布器(){
var _value=0
return {
next:function(){
_value+=1
return{
value:_value
}
}
}
}
2
(3)、实现迭代器
function 发布器(){
var _value=0
var max=3
return {
next:function(){
_value+=1
if(_value>max){throw new Error('已经没有下一个了')}
if(_value===max){
return {value:_value,done:true}
}else{
return{
value:_value,
done:false
}
}
}
}
}
3
2、生成器
生成器相当于迭代器的一个语法糖存在,生成器函数使用 function*
语法编写。 通过调用生成器的下一个方法消耗值时,Generator函数将执行,直到遇到yield关键字。
上述代码可以改下如下:
function* 发布器(){
var version=0
while(true){
version +=1
yield version //相当停顿一次,直到下一次调用这个方法
}
}
4
(1)、可迭代对象
若一个对象拥有迭代行为,比如在 for...of
中会循环哪些值,那么那个对象便是一个可迭代对象。如 Array
或 Map
拥有默认的迭代行为,而其他类型(比如Object
)则没有。
array=[1,2,3]
object={a:1,b:2,c:3}
for(let key of array){
console.log(key) //1,2,3
}
for(let key of object){
console.log(key) //报错:object is not iterable
}
array[Symbol.iterator] //f values(){[native code]} ,说明array有迭代方法
object[Symbol.iterator] //undefined ,object说明没有迭代方法
上述例子说明,由于object
不存在Symbol.iterator
方法,所以不能进行迭代,也就不能进行 for...of
操作,那怎么让一个对象可以进行迭代呢???
object={a:1,b:2,c:3}
object[Symbol.iterator]=function *(){ //让对象可迭代
let keys=Object.keys(object)
for(let i=0;i<keys.length;i++){
yield object[keys[i]]
}
}
for(let value of object){ //对象可以用for...of 了
console.log(value) //打印出1,2,3
}
拓展一下:
for(let i=0;i<10;i++){}; //普通for循环
for(let key in object){} // 遍历一个对象,没有停顿
for(let item of iterableObject){} //可迭代对象,迭代是一个一个访问,有停顿的
网友评论